我有一个复杂的函数,我想使用一个依赖于父函数参数的嵌套函数。如果嵌套函数的每个选项都需要不同的参数集,我该怎么做?
这是一个玩具示例
#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
这可能是一件非常简单的事情,但现在我还没有看到一个干净的解决方案。
答案 0 :(得分:2)
首先请注意,可以传递函数本身,但如果传递带有名称的字符串,下面的代码也会起作用。使用...传递其他参数,以便它们的编号不固定。 a1
和a2
就像问题一样。
# 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