Ross Boylan wrote:> I want to add an argument if it is not present. Following the Green
> Book, p. 337:
> test <- function(x, ...){
> dots <- list(...)
> if (!hasArg(from))
> from <- 0
> else
> from <- dots$from
> curve(x, from=from, ...)
> }
>
>
>>test(sin)
>>test(sin, from=4)
>
> Error in curve(x, from = from, ...) : formal argument "from"
matched by
> multiple actual arguments
>
> The FAQ says, in the section on differences between R and S,
> "R disallows repeated formal arguments in function calls."
>
> That seems a perfectly reasonable rule, but how do I handle this
> situation?
>
Hi, Ross,
Add "from" to your function:
test <- function(x, from = 0, ...) {
curve(x, from = from, ...)
}
Or another way:
test <- function(x, ...) {
dots <- list(...)
if(!hasArg(from)) dots$from <- 0
dots$expr <- x
do.call("curve", dots)
}
I actually prefer the latter if I'm changing many arguments. I do this
quite often when writing custom lattice plots and I want to override
many of the defaults.
HTH,
--sundar