Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function R:指定字符串作为调用另一个函数的函数的参数_Function_R_Apply_Do.call - Fatal编程技术网

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

Function R:指定字符串作为调用另一个函数的函数的参数,function,r,apply,do.call,Function,R,Apply,Do.call,这是一个关于R中编码的问题 我提供的例子是说教性的。假设我有一个名为“func1”和“func2”的函数,其中每个函数都有两个参数(比如标量)。我想指定另一个函数“applyfunction”,它有三个参数:要使用的函数的最后一个数字('1'或'2')以及函数的两个参数。例如,我想做这样的事情(当然不行): applyfunction(1,2,3)它将有效运行的func1(2,3)和 applyfunction(2,9,43)它将在哪里有效运行func2(9,43) 有什么想法吗 最好是DB您可

这是一个关于R中编码的问题

我提供的例子是说教性的。假设我有一个名为“func1”和“func2”的函数,其中每个函数都有两个参数(比如标量)。我想指定另一个函数“applyfunction”,它有三个参数:要使用的函数的最后一个数字('1'或'2')以及函数的两个参数。例如,我想做这样的事情(当然不行):

applyfunction(1,2,3)
它将有效运行的
func1(2,3)

applyfunction(2,9,43)
它将在哪里有效运行
func2(9,43)

有什么想法吗


最好是DB

您可能想看看
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))
编辑:包装将是:

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

applyfunction("function1",1,2)
applyfunction("function2",1,2,3)

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

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

func1如果您真的想“按数字”完成:

> 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

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

使用函数变量之一作为开关如何

func1 <- function(x,y,z) { 
## Function One stuff goes here
if (x == 1) { 
var1 <- 1 
} 
## Function Two stuff goes here 
if (x == 2) { 
var1 <- 2 
}
return(var1)
} 

这里有一个切换或粘贴的替代方法,只需使用索引从列表中进行选择:

 function1=function(a,b) a+b
 function2=function(a,b,c) a*b
 applyfunc <- function(n, aa, bb){ c(function1, function2)[[n]](aa,bb) }
 applyfunc(1, 4, 3)
 # [1] 7
 applyfunc(2, 4, 3)
 #[1] 12
 applyfunc(3, 4, 3)
# Error in c(function1, function2)[[n]] : subscript out of bounds
function1=函数(a,b)a+b
函数2=函数(a,b,c)a*b

applyfunc
match.fun
比get
更适合这种用法。@hadley:为什么?不匹配。有趣的
只需使用
envir
mode
args调用
get
,在这种情况下?要扩展,是的,您是对的,但答案没有这样做,而且名称更多evocative@hadley:谢谢,我只是想确定我明白了。
 function1=function(a,b) a+b
 function2=function(a,b,c) a*b
 applyfunc <- function(n, aa, bb){ c(function1, function2)[[n]](aa,bb) }
 applyfunc(1, 4, 3)
 # [1] 7
 applyfunc(2, 4, 3)
 #[1] 12
 applyfunc(3, 4, 3)
# Error in c(function1, function2)[[n]] : subscript out of bounds