假设我有这样的功能:
myFun <- function(arg1, arg2, arg3) {
if(arg3 == 'A') funA(arg1, arg2)
else if(arg3 == 'B') funB(arg1, arg2)
else if(arg3 == 'C') funC(arg1, arg2)
}
有没有办法不连续重复arg1, arg2
,但不知何故更智能地构建呼叫?我正在调查match.call
,但不确定它是否适合我的用例。
答案 0 :(得分:2)
您可以将match.arg()
与paste0()
一起使用。
myFun <- function(arg1, arg2, arg3) {
stopifnot(arg3 %in% c("A", "B", "C"))
paste0("fun", arg3)
}
如果选项arg3
c("A", "B", "C")
,则会触发错误
myFun(arg3 = "A")
# [1] "funA"
myFun(arg3 = "defg")
# Error: arg3 %in% c("A", "B", "C") is not TRUE
所以我们可以在do.call()
中使用它来用其他参数调用它。
myFun <- function(arg1, arg2, arg3) {
stopifnot(arg3 %in% c("A", "B", "C"))
do.call(paste0("fun", arg3), list(arg1, arg2))
}
答案 1 :(得分:1)
您的功能是否可以实际粘贴在一起,还是仅仅是示例的效果?如果是这样,请考虑一下:
get(paste0("me", "an"))(1:5)
[1] 3
我通过将其名称粘贴在一起来创建该函数。所以在你的例子中:
myFun <- function(arg1, arg2, arg3) {
get(paste0("fun", arg3))(arg1, arg2)
}
答案 2 :(得分:1)
以下是使用switch
myFun <- function(arg1, arg2, arg3){
switch(arg3,
A = {
out <- funA(arg1, arg2)
},
B = {
out <- funB(arg1, arg2)
},
C= {
out <- funC(arg1, arg2)
},
stop("Enter something that makes sense!")
)
return(out)
}
funA <- function(x,y) mean(c(x,y))
funB <- function(x,y) sum(c(x,y))
funC <- function(x,y) var(c(x,y))
myFun(3, 4, "A")
#[1] 3.5
myFun(3, 4, "B")
#[1] 7
myFun(3, 4, "C")
#[1] 0.5
myFun(3, 4, "D")
myFun中的错误(3,4,&#34; D&#34;):输入有意义的内容!