我在循环中定义函数并试图强制评估循环变量而不必携带私有环境。R范围:在没有本地环境的情况下在函数中强制变量替换
实施例:一组函数handlers$h1
,handlers$h2
,...,handlers$h6
刚刚穿过1,2,...,6到另一个函数,如下所示:
handlers <- list()
for (i in 1:6) {
handlers[[paste0('h', i)]] <- function() {
message(i) # <-- example
}
}
所以handlers$h1()
应消息1,handlers$h2()
应该消息2,...
相反,所有的函数返回6
的i
的当前值。
为了解决这个问题,我可以用一个封闭的specified in this question
msg <- function(i) {
force(i)
function() { message(i) }
}
for (i in 1:6) {
handlers[[paste0('h', i)]] <- msg(i)
}
现在可以按预期的各项功能,但每个功能都有随身携带自己的环境:
handlers$h1
# function() { message(i) }
# <environment: 0x9342b80>
我该如何做到这一点,以便handlers$h1
打印function() { message(1) }
,即评估i
并将其直接替换为defin ition,消除对环境的需求?
我能想到的唯一办法是:
- 使用
eval
(东西我不喜欢这样做); - 写出每个定义由手与1-6直接取代的(在这种情况下,其中只有6个功能正常,但在一般的不可伸缩)
R中的每个功能都有一个相关的环境:你为什么担心呢? – hadley 2013-03-26 13:23:28
另外,你没有通过使用闭包来解决它(你已经这样做了),你可以通过使用'force'来解决它。 – hadley 2013-03-26 13:31:34