7

私は、多かれ少なかれ関数型プログラミング スタイルのように、特殊な関数の辞書を返すことによって、関数ファクトリを考え出そうとします。次のコードでこれを実行しようとしています。

require(hash)

names = c("aa","bb","cc");
funs = hash()
for (i in seq(length(names))) {
  n = names[i]
  funs[[n]] = function(x) { 
    print(paste(n,":",x, sep="")) 
 }
}

明らかに、配列には 3 つの関数があります。ただし、それらはすべて反復の最後の関数と同じように動作します。

> funs[["aa"]](1)
[1] "cc:1"
> funs[["bb"]](2)
[1] "cc:2"
> funs[["cc"]](3)
[1] "cc:3"

私の推測では、R は新しい関数インスタンスを作成していませんが、for ループ内で同じ関数オブジェクトを再利用しています。

Rが別の関数オブジェクトを作成することを期待して、次のことを試します。

  funs[[n]] = eval(parse(text="function(x) { print(paste(n,':',x, sep='')) }"))

しかし、それは最初のものと同じように機能します。

さまざまな関数オブジェクトを作成するジェネレーターを作成する方法を知っていますか?

4

1 に答える 1