我有一个函数我要传递...给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))与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), ...)
}
Run Code Online (Sandbox Code Playgroud)
所以任何额外的参数都可以传递给plot,但是然后调用simpleFun(rnorm(10), rnorm(10), xlim = c(-1, 1))将无法工作,因为将xlim提供两个参数plot.
所以,基本上,我想知道是否有办法为传递的任何参数设置默认值...?我意识到我定义上面的东西的方式可能不太理想,但这是我在这一点上提出的最好的方法(它仍然不起作用).
我认为这一点需要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)
| 归档时间: |
|
| 查看次数: |
117 次 |
| 最近记录: |