将默认参数设置为“...”

时间:2016-08-04 16:48:25

标签: 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))
}

然后我可以在第一个示例(由用户定义)和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), ...)
}

以便可以将任何其他参数传递给plot,但随后调用simpleFun(rnorm(10), rnorm(10), xlim = c(-1, 1))将无效,因为将向xlim提供两个plot参数。

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

1 个答案:

答案 0 :(得分:2)

我认为这个要求do.call()。请注意,我已重命名您的默认参数xy,以匹配plot()中参数1和2的参数。如果您想继续使用ab,请取消注释第四行。但如果坚持使用默认名称,它将使事情变得更容易。

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)
}

这似乎可以在这些样本运行中正常工作。

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))