我嘗試通過返回專用函數字典來創建一個函數工廠,或多或少地像函數式編程風格那樣。我嘗試在下面的代碼中執行此操作。R中的函數工廠
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='')) }"))
,但它的工作原理相同,第一個。
你知道如何創建一個創建不同函數對象的生成器嗎?
我懷疑這是一個懶惰評估問題。 –