从函数中的参数构造函数调用

时间:2016-07-23 03:08:14

标签: r

假设我有这样的功能:

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,但不确定它是否适合我的用例。

3 个答案:

答案 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;):输入有意义的内容!