将默认参数设置为"..."

Dan*_*son 7 r

我有一个函数我要传递...plot,所以用户可以添加其他参数.对于其中一些可选参数,我想设置默认值,而不将它们声明为函数中的形式参数.这是一个简单的例子

simpleFun <- function(a, b,...) {
    args <- as.list(match.call())
    if(is.null(args$xlim)) args$xlim <- quote(c(-6, 6))

    plot(a, b, xlim = eval(args$xlim))
}
Run Code Online (Sandbox Code Playgroud)

然后我可以运行simpleFun(rnorm(10), rnorm(10), xlim = c(-1, 1))simpleFun(rnorm(10), rnorm(10))xlimc(-1, 1)在第一实施例(通过用户定义的)和c(-6, 6)在第二个(不是由用户定义).当然,问题...是现在无处可去.我想更明确地指出它

simpleFun2 <- function(a, b,...) {
    args <- as.list(match.call())
    if(is.null(args$xlim)) args$xlim <- quote(c(-6, 6))

    plot(a, b, xlim = eval(args$xlim), ...)
}
Run Code Online (Sandbox Code Playgroud)

所以任何额外的参数都可以传递给plot,但是然后调用simpleFun(rnorm(10), rnorm(10), xlim = c(-1, 1))将无法工作,因为将xlim提供两个参数plot.

所以,基本上,我想知道是否有办法为传递的任何参数设置默认值...?我意识到我定义上面的东西的方式可能不太理想,但这是我在这一点上提出的最好的方法(它仍然不起作用).

Ric*_*ven 2

我认为这一点需要do.call(). 请注意,我已重命名您的默认参数x,并y与 中的参数 1 和 2 相匹配plot()。如果您想继续使用aand b,请取消注释第四行。但如果您坚持使用默认名称,事情会变得容易得多。

simpleFun <- function(x, y, ...) {
    args <- as.list(match.call()[-1])
    if(!any(names(args) == "xlim")) 
        args$xlim <- c(-6, 6)
    ## names(args)[1:2] <- c("x", "y")
    do.call("plot", args)
}
Run Code Online (Sandbox Code Playgroud)

这似乎在这些示例运行中工作得很好。

simpleFun2(a = rnorm(10), b = rnorm(10))
simpleFun2(a = rnorm(10), b = rnorm(10), xlim = c(-1, 1))
simpleFun2(a = rnorm(10), b = rnorm(10), xlim = c(-1, 1), ylim = c(-4, 4))
Run Code Online (Sandbox Code Playgroud)

  • 与大多数参数不同,我想这必须完整写出。我可以写 `plot(rnorm(10), rnorm(10), xli=c(-6,6))` 但不能写 `simpleFun(rnorm(10), rnorm(10), xli=c(-6,6) ))` (2认同)