如何使用可能具有不同参数集的一个函数

时间:2018-04-16 19:57:36

标签: r function arguments

我有一个复杂的函数,我想使用一个依赖于父函数参数的嵌套函数。如果嵌套函数的每个选项都需要不同的参数集,我该怎么做?

这是一个玩具示例

#all my function options (there are several and the idea is that I can easily add new ones without altering the parent function)

a1 <- function(x,y){
    return(x+y)
}

a2 <- function(x,y,z){
    return(x+y+z)
}

# the parent function
complexfun <- function(a,b,c,...){
    x = b+c
    y = (b+c)^2
    z = sqrt(b+c)
    myfun=get(a)
    ret=myfun(x,y,z)
    return(ret)
}

# obviously, when I run this than I have an error
complexfun(a='a1',b=1,c=1)
Error in myfun(x, y, z) : unused argument (z)

#if I remove the z, it's the other way around...
complexfun(a='a2',b=1,c=1)
Error in myfun(x, y) : argument "z" is missing, with no default

这可能是一件非常简单的事情,但现在我还没有看到一个干净的解决方案。

1 个答案:

答案 0 :(得分:2)

首先请注意,可以传递函数本身,但如果传递带有名称的字符串,下面的代码也会起作用。使用...传递其他参数,以便它们的编号不固定。 a1a2就像问题一样。

# the parent function
complexfun <- function(a, ...) {
  a <- match.fun(a)
  a(...)
}

complexfun(a1, 1, 2)
## [1] 3
complexfun(a2, 1, 2, 3)
## [1] 6

使用函数中定义的x,y,z的替代方法。这会计算函数a的参数数量,然后只传递那么多参数。

complexfun <- function(a,b,c,...){
    x <- b + c
    y <- (b + c)^2
    z <- sqrt(b + c)
    nargs <- length(as.list(a)) - 1
    L <- list(x, y, z)
    do.call(a, head(L, nargs))
}

complexfun(a1, 1, 2)
## [1] 12

complexfun(a2, 1, 2)
## [1] 13.73205