私はループ内の関数を定義していて、プライベート環境を持ち歩くことなくループ変数の評価を強制しようとしています。
例: 1、2、...、6を通過して次のような別の関数に渡される一連の関数handlers$h1
、、handlers$h2
... :handlers$h6
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つしかない場合は問題ありませんが、一般にスケーラブルではありません)。