我正在阅读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".什么循环?什么最终价值,在哪里?一定是简单的我想念,但我只是没有看到它.非常感谢提前.
为什么在没有提供b但在函数内部需要时没有报告错误?谢谢!
f2 <- function(a,b) {a[b]}; f2(a=rep(1, 2))
Run Code Online (Sandbox Code Playgroud)
我知道这个函数没有错误:
f <- function(x) {
10
}
f(stop("This is an error!"))
Run Code Online (Sandbox Code Playgroud)
由于懒惰的评价但是这个
f <- function(x) {
force(x)
10
}
f(stop("This is an error!"))
Run Code Online (Sandbox Code Playgroud)
或这个
f <- function(x) {
x
10
}
f(stop("This is an error!"))
Run Code Online (Sandbox Code Playgroud)
会产生错误.因为在这两种情况下都在函数中使用 x .以上两个例子都来自http://adv-r.had.co.nz/Functions.html.由于B也使用 F2内,应该有必要增加内部F2力?谢谢!