Function R:指定字符串作为调用另一个函数的函数的参数
这是一个关于R中编码的问题 我提供的例子是说教性的。假设我有一个名为“func1”和“func2”的函数,其中每个函数都有两个参数(比如标量)。我想指定另一个函数“applyfunction”,它有三个参数:要使用的函数的最后一个数字('1'或'2')以及函数的两个参数。例如,我想做这样的事情(当然不行):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您可
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
applyfuncmatch.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