【问题标题】:R function closure environments [duplicate]R函数闭包环境[重复]
【发布时间】:2015-11-14 22:23:25
【问题描述】:

我最近遇到了一些意外的 R 行为,可以使用以下代码以最简单的形式重现:

make.adder <- function(a) {function(x) {x + a}}
s <- list(1, 2)
adders <- lapply(s, make.adder)

我们现在可能期望 adders[[1]] 是一个加 1 的函数,而 adders[[2]] 是一个加 2 的函数。然而,

adders[[1]](1)

返回 3(当我们预期为 2 时)。用

看看环境
environment(adders[[1]])$a

返回 2,这再次令人惊讶(但一致)。这里发生了什么?

如果我们尝试使用 for 循环,我们会看到类似的行为:

adders <- list()
for (i in seq(1, 2)) {adders[[i]] <- make.adder(i)}

再一次,adders[[1]] (1) 返回 3。我们如何创建一个包含 100 个函数的列表,使得第 i 个函数是 make.adder(i)?

【问题讨论】:

  • 尝试更新版本的 R。
  • 通读here,我可能会添加几乎完全包含该示例的内容。
  • @BenBolker 我认为找到的骗子可能有更好的答案。
  • 好的,我会投票重新开放,这样我们就可以用正确的骗子重新关闭它......

标签: r closures environment


【解决方案1】:

我认为您需要使用force() 来确保在您期望的时候评估参数。更多信息请参见?force ...

make.adder <- function(a) { force(a); function(x) {x + a}}
s <- list(1, 2)
adders <- lapply(s, make.adder)

adders[[1]](1) ## 2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 2020-05-02
    • 2015-11-07
    • 2015-02-09
    • 2020-07-24
    • 1970-01-01
    相关资源
    最近更新 更多