R函数闭包环境

时间:2015-11-14 22:23:25

标签: r closures environment

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

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

我们现在可能期望加法器[[1]]是一个加1的函数,而加法器[[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)}

再次,加法器[[1]](1)返回3.我们如何创建一个包含100个函数的列表,这样第i个函数就是make.adder(i)?

1 个答案:

答案 0 :(得分:2)

我认为你需要使用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