R:如何创建函数向量?

Roc*_*nce 6 r

我想使用两个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的最后一个值(这是一个全局变量)进行评估.

有人有想法吗?

谢谢

Jor*_*eys 3

这可以使用 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 等,只是表明它们是精确的整数(占用更少的内存空间)。