为什么 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
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