Reputation: 309
Is it possible to have multiple ellipsis arguments in an R function? A simplified version of what I'm trying to do is this:
plotgenerator<-function(x,y,...,...,...){
plot(x,y,...)
axes(...)
legend(...)
}
My thought was to use optional string arguments, like this:
plotgenerator<-function(x,y,plotargs="",axesargs="",legendargs=""){
plot(x,y,plotargs)
axes(axesargs)
legend(legendargs)
}
But that doesn't work. Does anyone know if something like this is possible? I have searched a lot for this, but a search string like "R ..." isn't actually very helpful ;)
Upvotes: 15
Views: 2800
Reputation: 11473
You could so something similar to your second choice if you use do.call
, which allows you to pass the arguments to a function as a list. E.g. pass axesarg
as a list and then in your function have: do.call(axes,axesarg)
etc
For example:
outer_fxn <- function(inner_args=list(), ...) {
do.call(inner_fxn, inner_args)
}
inner_fxn <- function(...) {
# do stuff
}
# function call
outer_fxn(inner_args=list(a=1, b=2), outer_arg1=3, etc)
In the above, any arguments that should be handled by the inner_fxn
...
should be passed in with in the inner_args
list. The outer_fxn
...
arguments are handled as usual.
Upvotes: 16
Reputation: 49640
The first way that you show is not supported because there is no way for the parser to know which set of dots the caller wants the argument to go into.
You can capture the dots into a list and work from there with something like:
mydots <- list(...)
You can then make copies, remove items that are not appropriate for the function that you are calling, then use do.call (as has been mentioned) to call your function.
The second approach may be cleaner if you think the caller may want to send different values to different functions that have the same argument name. Again use do.call to pass the list of arguments.
Upvotes: 4