解释一个懒惰的评价怪癖

解释一个懒惰的评价怪癖

我正在阅读Hadley Wickhams关于Github的书,特别是关于懒惰评估的这一部分。在那里,他举例说明了懒惰评估的后果,在有add/adders功能的部分。让我引用一下:

在使用lapply或循环创建闭包时,[懒惰评估]很重要:

add <- function(x) {
  function(y) x + y}adders <- lapply(1:10, add)adders[[1]](10)adders[[10]](10)

在第一次调用其中一个加法器函数时,会对x进行延迟计算。此时,循环完成,x的最终值为10.因此,所有加法器函数都会在其输入上添加10,可能不是您想要的!手动强制评估修复了问题:

add <- function(x) {
  force(x)
  function(y) x + y}adders2 <- lapply(1:10, add)adders2[[1]](10)adders2[[10]](10)

我似乎不明白那一点,而且那里的解释很少。有人可以详细说明这个特定的例子,并解释那里发生了什么?我特别对句子感到困惑“此时,循环完成,x的最终值为10”。什么循环?什么最终价值,在哪里?一定是简单的我想念,但我只是没有看到它。非常感谢提前。


MMMHUHU
浏览 504回答 2
2回答

largeQ

从R 3.2.0开始,这已不再适用!更改日志中的相应行显示:诸如apply函数和Reduce()之类的高阶函数现在强制它们应用的函数的参数,以便消除惰性求值和闭包中的变量捕获之间的不期望的交互。事实上:add <- function(x) {&nbsp; function(y) x + y}adders <- lapply(1:10, add)adders[[1]](10)# [1] 11adders[[10]](10)# [1] 20
打开App,查看更多内容
随时随地看视频慕课网APP