我正在阅读Hadley Wickhams关于Github的书,特别是关于懒惰评估的这一部分.在那里,他举例说明了懒惰评估的后果,在有add/adders功能的部分.让我引用一下:
在使用lapply或循环创建闭包时,[懒惰评估]很重要:
Run Code Online (Sandbox Code Playgroud)add <- function(x) { function(y) x + y } adders <- lapply(1:10, add) adders[[1]](10) adders[[10]](10)在第一次调用其中一个加法器函数时,会对x进行延迟计算.此时,循环完成,x的最终值为10.因此,所有加法器函数都会在其输入上添加10,可能不是您想要的!手动强制评估修复了问题:
Run Code Online (Sandbox Code Playgroud)add <- function(x) { force(x) function(y) x + y } adders2 <- lapply(1:10, add) adders2[[1]](10) adders2[[10]](10)
我似乎不明白那一点,而且那里的解释很少.有人可以详细说明这个特定的例子,并解释那里发生了什么?我特别对句子感到困惑"此时,循环完成,x的最终值为10".什么循环?什么最终价值,在哪里?一定是简单的我想念,但我只是没有看到它.非常感谢提前.
当尝试使用时创建类似函数的列表时lapply,我发现列表中的所有函数都是相同的,并且等于最终元素应该是什么.
考虑以下:
pow <- function(x,y) x^y
pl <- lapply(1:3,function(y) function(x) pow(x,y))
pl
[[1]]
function (x)
pow(x, y)
<environment: 0x09ccd5f8>
[[2]]
function (x)
pow(x, y)
<environment: 0x09ccd6bc>
[[3]]
function (x)
pow(x, y)
<environment: 0x09ccd780>
Run Code Online (Sandbox Code Playgroud)
当您尝试评估这些功能时,您会得到相同的结果:
pl[[1]](2)
[1] 8
pl[[2]](2)
[1] 8
pl[[3]](2)
[1] 8
Run Code Online (Sandbox Code Playgroud)
这里发生了什么,我怎样才能得到我想要的结果(列表中的正确功能)?