R:将字符串指定为调用另一个函数的函数的参数

Dav*_*urk 8 r function apply do.call

这是关于R编码的问题.

我提供的例子是教学.假设我有一个名为'func1'和'func2'的函数,其中每个都有两个参数(让我们说scalars).我想指定另一个函数'applyfunction',它有三个args:要使用的函数的最后一个数字('1'或'2'),以及函数的两个参数.例如,我想做这样的事情(当然这不起作用):

applyfunction(1,2,3)它会有效地运行func1(2,3)

applyfunction(2,9,43)它会有效运行的地方func2(9,43).

有任何想法吗?

最好,DB

Sac*_*amp 7

您可能希望查看do.call(),它使用列表中提供的参数调用函数.编写一个完全符合你想要的包装并不难.

function1=function(a,b)a+b
function2=function(a,b,c)a+b+c

do.call("function1",list(1,2))
do.call("function2",list(1,2,3))
Run Code Online (Sandbox Code Playgroud)

编辑:包装将是:

applyfunction=function(fun,...)do.call(fun,list(...))

applyfunction("function1",1,2)
applyfunction("function2",1,2,3)
Run Code Online (Sandbox Code Playgroud)


Jos*_*ich 6

这是另一种选择.您可以向switch列表中添加更多功能.

func1 <- function(a, b) a + b
func2 <- function(a, b) a - b
applyfunction <- function(FUN, arg1, arg2) {
  appFun <- switch(FUN,
      func1,  # FUN == 1
      func2,  # FUN == 2
      stop("function ", FUN, " not defined"))  # default
  appFun(arg1, arg2)
}
applyfunction(1,2,3)
# [1] 5
applyfunction(2,9,43)
# [1] -34
applyfunction(3,9,43)
# Error in applyfunction(3, 9, 43) : function 3 not defined
Run Code Online (Sandbox Code Playgroud)


Spa*_*man 5

如果你真的希望它由"数字"完成:

> applyfunction=function(n,a,b){get(paste("func",n,sep=""))(a,b)}
> func1=function(a,b){a+b}
> func2=function(a,b){a*b}
> applyfunction(1,4,3)
[1] 7
> applyfunction(2,4,3)
[1] 12
Run Code Online (Sandbox Code Playgroud)

使用get和paste来获取与名称关联的函数.