繁体   English   中英

了解R中的延迟评估

[英]Understanding lazy evaluation in R

我试图理解R中的懒惰评估是如何运作的。 它是否仅适用于函数参数的评估? 因为我理解,例如

f <- function(x = x, y = x*2) {
  c(x, y)
}

f(2)
[1] 2 4

但是在其他语言中,例如Haskell,惰性求值意味着函数调用仅在实际使用时才会被评估。 所以我希望这样的东西能在瞬间运行:

g <- function(x) {
  y <- sample(1:100000000)
  return(x)
}

g(4)

但它清楚地评估了sample调用,即使它的结果没有被使用。

有人可以准确地解释这是如何工作的,还是指向我详细解释的方向?

类似的问题:

问题与类似的措辞,但不同的问题

正如您已经发现的那样,R在一般意义上不使用惰性求值。 但是R确实通过函数delayedAssign()提供了这个功能,如下所示:

> system.time(y <- sample(1E8))
   user  system elapsed 
  7.636   0.128   7.766 
> system.time(length(y))
   user  system elapsed 
      0       0       0 
system.time(delayedAssign("x", sample(1E8)))
   user  system elapsed 
  0.000   0.000   0.001 
> system.time(length(x))
   user  system elapsed 
  7.680   0.096   7.777 

如您所见, y立即被评估,因此确定y的长度根本不需要时间。 另一方面, x在创建时不进行求值,只有delayedAssign()返回一个评估x的承诺,并且只有当我们实际需要x的值时,在这种情况下确定其长度,才会计算x

如果将表达式放在函数中或在全局环境中执行,则无关紧要,因此将表达式封装在您在示例中执行的函数中并不会真正添加任何内容,这就是我将其排除的原因。 但如果你想确定,请尝试:

a.f <- function(z) { delayedAssign("x", sample(1E8)); return(z+1) }
system.time(a.f(0))
   user  system elapsed 
      0       0       0 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM