解释一个懒惰的评价怪癖
我正在阅读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”。什么循环?什么最终价值,在哪里?一定是简单的我想念,但我只是没有看到它。非常感谢提前。
largeQ