我正在阅读 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”这句话感到特别困惑。什么循环?什么最终值,在哪里?一定是我想念的简单的东西,但我只是看不到它。提前非常感谢。