为什么 lapply with closures 会报错?

Why does lapply with closures give errors?

R inferno 将以下输出解释为挑战:

>xr <- lapply(11:14,function(i) function() i^2)
>sapply(1:4, function(j) xr[[j]]())
[1]196 196 196 196

我很惭愧地说我失败了。这是怎么回事?我的猜测是,这与 i^2 记住它所定义的环境有关,但我很确定 xr 的每个元素都使用了不同的 i,这也规定了这是一个懒惰的评估问题。

假设您创建了以下函数:

xr1 <- function() 11^ 2
xr2 <- function() 12 ^ 2
xr3 <- function() 13 ^ 2
xr4 <- function() 14 ^ 2

所以当你调用其中任何一个时你会得到

xr1()
#[1] 121

xr3()
#[1] 169

现在,我们不再对不同的数字执行 4 次相同的函数,而是遍历我们想要计算的 2 次方的值,并创建一个包含 4 个函数作为其元素的列表,即

xr <- lapply(11:14, function(i) function() i ^ 2)

所以现在 xr 是一个包含 4 个函数的列表。

函数 1,即 xr[[1]]() 将给出 11^2 = 121

函数 2,即 xr[[2]]() 将得到 12^2 = 144 等等...

因此,我们现在使用 sapply 遍历 xr 的每个元素并评估其功能,而不是单独调用每个元素,因此

sapply(1:4, function(j) xr[[j]]())
#[1] 121 144 169 196