这是关于R编码的问题。
我提供的例子是教学。假设我有一个名为'func1'和'func2'的函数,其中每个都有两个参数(让我们说scalars)。我想指定另一个函数'applyfunction',它有三个args:要使用的函数的最后一个数字('1'或'2'),以及函数的两个参数。例如,我想做这样的事情(当然这不起作用):
applyfunction(1,2,3)
它将有效地运行func1(2,3)
和
applyfunction(2,9,43)
它会有效地运行func2(9,43)
。
有什么想法吗?
最好,DB
答案 0 :(得分: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))
编辑:包装器将是:
applyfunction=function(fun,...)do.call(fun,list(...))
applyfunction("function1",1,2)
applyfunction("function2",1,2,3)
答案 1 :(得分: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
答案 2 :(得分: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
使用get和paste来获取与名称相关联的函数。
答案 3 :(得分:0)
如何使用其中一个函数变量作为开关?
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)
}
并且,你可以使用相同的功能,开关是变量“x”:
> func1(1,1,1)
[1] 1
> func1(2,1,1)
[1] 2
答案 4 :(得分:0)
这里是切换或粘贴的替代方法,只需使用索引从列表中进行选择:
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