【问题标题】:Why does lapply with closures give errors?为什么 lapply 带有闭包会出错?
【发布时间】:2020-07-08 13:32:27
【问题描述】:

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,这也排除了惰性评估的可能性问题。

【问题讨论】:

  • 用lapply(11:14,function(i) i^2)不是更好吗?
  • 使用你的代码我得到了121 144 169 196
  • 你会从他们的环境中得到ienvironment(xr[[1]])$i
  • @J.Mini 也许重新开始R 并尝试一个新的会话。
  • @Duck R Inferno 已经过时了。 lapply 中的延迟评估在旧版本的 R 中的工作方式不同。

标签: r closures lapply


【解决方案1】:

假设您创建了以下函数:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多