我在循环中定义函数并尝试强制评估循环变量而不必携带私有环境。
示例:一组函数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
。
为了解决这个问题,我可以使用这个问题中指定的闭包
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
并将其直接替换到定义中,从而消除对环境的需求?
我能想到的唯一方法是:
- 使用
eval
(我不想做的事情); - 用直接替换的 1-6 手动写出每个定义(在这种情况下很好,只有 6 个函数,但通常不可扩展)