2015-11-14 95 views
2

我最近遇到了一些意想不到[R的行为,它可以以最简单的形式,用下面的代码被复制:一个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)?

+2

尝试R. –

+1

的最新版本,并尝试了这个问题http://stackoverflow.com/questions/16129902/explain-a-lazy-evaluation-quirk – rawr

+0

而阅读[这里](http://adv-r.had.co.nz/Functions.html#function-arguments)我可能会添加几乎完全包含该示例。 – joran

回答

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