I have a function where I'm passing ...
to plot
, so the user can add additional arguments. For some of these optional arguments, I'd like to setup default values, without declaring them as formal arguments in the function. Here's a simple example
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))
}
Then I can run simpleFun(rnorm(10), rnorm(10), xlim = c(-1, 1))
or simpleFun(rnorm(10), rnorm(10))
and xlim
will be c(-1, 1)
in the first example (defined by user) and c(-6, 6)
in the second (not defined by user). The problem, of course, is that ...
is now not going anywhere. I'd like to specify it more like
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), ...)
}
so that any additional argument can be passed to plot
, but then calling simpleFun(rnorm(10), rnorm(10), xlim = c(-1, 1))
won't work because there will be two xlim
arguments supplied to plot
.
So, basically, I'm wondering if there's a way to set default values for any arguments passed through ...
? I realize the way I've defined things above is probably less than ideal, but it's the best I've come up with at this point (which still doesn't work).
I think this one calls for do.call()
. Notice I have renamed your default arguments x
and y
to match those for arguments 1 and 2 in plot()
. If you want to continue to use a
and b
, uncomment the fourth line. But it will make things a lot easier if you stick with the default names.
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)
}
This seems to work fine on these sample runs.
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))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With