我有一个函数,我将...
传递给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))
或xlim
和c(-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
参数。
所以,基本上,我想知道是否有办法为通过...
传递的任何参数设置默认值?我意识到我上面定义的方法可能不太理想,但这是我在这一点上提出的最好的方法(这仍然不起作用)。
答案 0 :(得分:2)
我认为这个要求do.call()
。请注意,我已重命名您的默认参数x
和y
,以匹配plot()
中参数1和2的参数。如果您想继续使用a
和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)
}
这似乎可以在这些样本运行中正常工作。
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))