如何通过包装函数传递替代参数?

时间:2013-10-08 21:16:10

标签: r

我想为两个带有可选参数的函数编写一个包装函数。

以下是包含funfunA

的函数funB的示例
funA <- function(x = 1, y = 1) return(x+y)
funB <- function(z = c(1, 1) return(sum(z))

fun <- function(x, y, z)

如果提供funx+y,我希望x返回y,如果提供了矢量sum(z),则zlm

我试图了解match.call函数如何获取此类可选参数,但目前尚不清楚如何在此处使用fun <- function(...){ inputs <- list(...) if (all(c("x", "y") %in% inputs){ ans <- funA(x, y) } else if ("z" %in% inputs){ ans <- funB(z) }

在找到相关问题(例如How to use R's ellipsis feature when writing your own function?using substitute to get argument name with ))之后,我想出了一个可行的解决方案。

我的解决方案就是使用

ellipsis

有更好的方法吗?

注意:也许这个问题可以作为重复内容关闭,但希望它可以用来引导其他用户找到一个好的解决方案:将我的搜索扩展到各种各样的内容会很有帮助除substitute之外,还包括match.call,{{1}}。

2 个答案:

答案 0 :(得分:4)

使用missing。如果提供了funA(x, y)x,则会返回y,如果不是funB,则返回z,如果提供了NULL,如果没有提供,则返回fun <- function(x, y, z) { if (!missing(x) && !missing(y)) { funA(x, y) } else if (!missing(z)) { funB(z) } funA

funB

这似乎回答了你提出的问题,但请注意funfun中的默认参数从未使用过,所以也许你真的想要一些不同的东西?

请注意,问题中提供的{{1}}仅在参数被命名时有效,而{{1}}在此处有效,即使它们是按位置提供的。

答案 1 :(得分:2)

我喜欢使用match.call这样的例子。这类似于您的解决方案,但更强大。

fun <- function(...){
  arg <- as.list(match.call())[-1]
  f <- ifelse(length(arg)>1,"funA","funB")
  do.call(f,arg)
}

fun(x=1,y=2) ## or fun(1,2) no need to give named arguments
[1] 3
> fun(z=1:10) ## fun(1:10)
[1] 55