r - 理解 R 中的惰性求值

标签 r function haskell lazy-evaluation

我试图了解 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调用,即使它的结果没有被使用。

有人可以准确解释这是如何工作的,或者指出我详细解释的方向吗?

类似的问题:

Question with similar wording, but different problem

最佳答案

正如您已经发现的那样,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另一方面,它在创建时不被评估,只是一个评估 x 的 promise 由 delayedAssign() 返回,并且仅当我们实际需要 x 的值时,在这种情况下确定其长度,x被评估。

表达式是放在函数中还是在全局环境中执行都没有关系,因此您在示例中所做的将表达式封装在函数中并没有真正添加任何内容,这就是我排除它的原因。但是,如果您想确定,请尝试:
a.f <- function(z) { delayedAssign("x", sample(1E8)); return(z+1) }
system.time(a.f(0))
   user  system elapsed 
      0       0       0 

关于r - 理解 R 中的惰性求值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42690195/

相关文章:

haskell - 部分应用从左到右

Rmarkdown - 嵌入句子中

php - php中的数字到单词转换(印度卢比)十进制字符串问题

css - 如何让 pkgdown 代码块具有深色背景?

sql - postgresql 语法 while exists 循环

c# - 如何将数字转换为 ASCII 字符?

haskell - 递归函数调用应该终止还是其实现有问题?

haskell - 什么是单子(monad)?

python - 将带有换行符的 csv 文件导入到 R 或 Python Pandas

r - 使用 aes_string 时,格式 geom_text 标签不起作用