是否可以从头创建省略号(```)对象?

时间:2013-09-07 07:55:48

标签: r

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

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

R中允许这些东西多少?

2 个答案:

答案 0 :(得分: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){ :)]

答案 1 :(得分: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()"