5

我找到了使用这样的伪代码将缺少的参数传递给具有默认值的函数的解决方案:

wrapperfX<-function(x)
{
    ...<-if(missing(x){
            list()
        }else{
            list(x=x)
        }
    targetf(...)
}

R中允许这些东西多少?

4

2 回答 2

5

您正在寻找的技巧可能是使用do.call它可以让您调用函数并将参数指定为列表:

wrapperfX <- function(x){
  dots<-if(missing(x)){
    list()
  }else{
    list(x=x)
  }
  do.call(targetf,dots)
}

如果列表元素具有名称,这也允许您指定命名参数。

> do.call(log,list(x=10,base=10))
[1] 1

相当于

log(x=10,base=10)

如果您正在调用的函数以点-点-点的形式表示,那么我将按照与将它们放在函数调用中相同的方式匹配参数。

[你也适当地缺少括号missing((x){:)]

于 2013-09-07T08:48:14.477 回答
2

如果您的函数依赖于评估的表达式,您可能需要使用substitute, 以避免评估...包装器内的调用。

例子:

f <- function(...) deparse(as.list(substitute(list(...)))[-1L])

wrap <- function(x){
    L <- if(missing(x)) list() else list(x)
    do.call(f, L)
}

wrap2 <- function(x){
    L <- if(missing(x)) list() else list(substitute(x))
    do.call(f, L)
}

请注意如何wrap2不“触及”这些论点:

f(1+2+3)      # "list(1 + 2 + 3)"
wrap(1+2+3)   # "list(6)"
wrap2(1+2+3)  # "list(1 + 2 + 3)"

对于空调用,它们是无法区分的:

f()      # "list()"
wrap()   # "list()"
wrap2()  # "list()"
于 2013-09-07T11:27:47.197 回答