如果我按如下方式创建函数:
what_is_love <- function(f) {
function(...) {
cat('f is', f, '\n')
}
}
并调用它lapply
: funs <- lapply(c('love', 'cherry'), what_is_love)
我得到意外的输出:
> funs[[1]]()
f is cherry
> funs[[2]]()
f is cherry
但请注意,当您不使用时,情况并非如此lapply
:
> f1 <- what_is_love('love')
> f2 <- what_is_love('cherry')
> f1()
f is love
> f2()
f is cherry
是什么赋予了?
我知道funs <- lapply(c('love', 'cherry'), what_is_love)
可以更完整地写出来:
params <- c('love', 'cherry')
out <- vector('list', length(params))
for (i in seq_along(params)) {
out[[i]] <- what_is_love(params[[i]])
}
out
但是当我浏览时,我看到这两个函数都有自己的环境:
Browse[1]> out[[1]]
function(...) {
cat('f is', f, '\n')
}
<environment: 0x109508478>
Browse[1]> out[[2]]
function(...) {
cat('f is', f, '\n')
}
<environment: 0x1094ff750>
但在每一个环境中,f
都是一样的......
Browse[1]> environment(out[[1]])$f
[1] "cherry"
Browse[1]> environment(out[[2]])$f
[1] "cherry"
我知道答案是“懒惰的评估”,但我正在寻找更多的深度......f
最终如何在两个环境中重新分配?从哪里来f
?在这个例子中,R 惰性求值是如何在幕后工作的?
-
编辑:我知道关于惰性求值和函数的另一个问题,但它只是说答案是“惰性求值”,而没有解释惰性求值实际上是如何工作的。我正在寻求更大的深度。