1

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

这是一个fun包装函数funA的例子funB

funA <- function(x = 1, y = 1) return(x+y)
funB <- function(z = c(1, 1) return(sum(z))

fun <- function(x, y, z)

我想fun返回x+yifxyare provided,sum(z)如果提供了向量z

我试图查看该lm函数如何接受这些可选参数,但不清楚究竟是如何使用的,例如,match.call这里是如何使用的。

在找到相关问题后(例如,如何在编写自己的函数时使用 R 的省略号功能?使用替换来获取参数名称)),我想出了一个可行的解决方案。

我的解决方案只是使用

fun <- function(...){
  inputs <- list(...)
  if (all(c("x", "y") %in% inputs){
    ans <- funA(x, y)
   } else if ("z" %in% inputs){
    ans <- funB(z)
   }

有没有更好的办法?

注意:也许这个问题可以作为重复关闭,但希望它可以用于指导其他用户找到一个好的解决方案:将我的搜索扩展到各种包括ellipsis, substitute,除了 match.call.

4

2 回答 2

4

使用missing. funA(x, y)如果两者xy提供,则返回,funB如果z没有提供,则返回,如果没有提供,则返回NULL

fun <- function(x, y, z) {
          if (!missing(x) && !missing(y)) {
             funA(x, y) 
          } 
          else if (!missing(z))  {
             funB(z)
          }

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

请注意fun,问题中提供的仅在命名参数时才有效,而fun即使在位置上提供了参数,此处也有效。

于 2013-10-08T21:42:00.793 回答
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
于 2013-10-08T21:54:29.050 回答