我想使用两个agruments函数'func'创建一个函数向量,例如这个:
func = function(number, coefficient) {
return(coefficient*number)
}
Run Code Online (Sandbox Code Playgroud)
这是我如何创建函数向量:
vector_of_functions = NULL
for (i in 1:4) {
vector_of_functions = c(vector_of_functions,
function(number) func(number=number, coefficient=i))
}
Run Code Online (Sandbox Code Playgroud)
我的问题是组成我的矢量的所有函数都是相同的,即使它们是通过循环使用不同的i创建的.它接缝使用i的最后一个值(这是一个全局变量)进行评估.
有人有想法吗?
谢谢
这可以使用 eval-parse 构造来解决,尽管我强烈建议您不要使用此构造。它通常会导致比其他任何事情都多的问题。但我找不到合适的 do.call 方法。
vector_of_functions = NULL
for (i in 1:4) {
vector_of_functions = c(vector_of_functions,
eval(parse(text=paste("function(number) func(number=number, coefficient=",i,")"))))
}
Run Code Online (Sandbox Code Playgroud)
原因正如 Aaron 所解释的:函数定义中的所有内容在函数求值之前均按原样采用。
小注:这尤其是函数列表,而不是向量。不可能有“函数”类型的向量。它也绝对没有用,因为你必须使用索引 [[]] 选择该函数才能使用它。然后我只需添加参数,而不是为其中一个参数的每个可能值定义一个函数。
所以你想要实现的目标还不清楚,但是如果你想应用具有不同系数的 func,我想知道为什么你不简单地这样做:
> x <- c(10,20,30)
> sapply(1:4,function(y)func(number=x,coefficient=y))
[,1] [,2] [,3] [,4]
[1,] 10 20 30 40
[2,] 20 40 60 80
[3,] 30 60 90 120
Run Code Online (Sandbox Code Playgroud)
Marek 对主题的变体(避免解析):
vector_of_functions = NULL
for (i in 1:4) {
vector_of_functions = c(vector_of_functions,
eval(substitute(function(number) func(number=number, coefficient=i),list(i=i))))
}
Run Code Online (Sandbox Code Playgroud)
你得到的 1L 等,只是表明它们是精确的整数(占用更少的内存空间)。