我尝试通过返回专门函数的字典来提出一个函数工厂,或多或少类似于函数式编程风格。我尝试在下面的代码中执行此操作。
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='')) }"))
但它的工作原理与第一个相同。
您知道如何创建一个生成不同函数对象的生成器吗?
根据哈德利的说法高级 R 编程、词法范围 http://adv-r.had.co.nz/Functions.html#lexical-scoping,变量n
在函数体内funs[['aa']]
, funs[['bb']]
, and funs[['cc']]
是变量n
in <environment: R_GlobalEnv>
.
例如:
> funs[["aa"]](1)
[1] "cc:1"
> n <- "1234"
> funs[["aa"]]("1")
[1] "1234:1"
为了做你想做的事,我将编写一个返回函数的函数:
funs.gen <- function(n) {
force(n)
function(x) {
print(paste(n, ":", x, sep=""))
}
}
names = c("aa","bb","cc");
funs = hash()
for (i in seq(length(names))) {
n = names[i]
funs[[n]] = funs.gen(n)
}
funs[["aa"]](1)
funs[["bb"]](2)
funs[["cc"]](3)
注意force
用于要求R不惰性求值表达式n
。如果你删除它,那么 R 将评估n
出于for
循环将产生与您的问题相同的结果。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)