[R] Name conflicts when passing arguments for one function to another

Prof Brian Ripley
Sat, 29 Jan 2005 18:34:16 -0000

On Sat, 29 Jan 2005, Graham Jones wrote:

> I am fairly new to R. I find it surprising that
>
> f <- function(x,a) {x-a}
> uniroot(f, c(0,1), a=.5)
>
> works, but
>
> integrate(f, 0, 1, a=.5)
>
> gives an error: Error in integrate(f, 0, 1, a = 0.5) : argument 4
> matches multiple formal arguments
>
> What is the best way of avoiding such surprises? Is there a way of
> telling integrate() that the 'a' argument is for f()?
>
> If I wrote my own function along the lines of uniroot() or integrate()
> is there a better way of passing on arguments?

You are being caught by partial matching. Ideally integrate would have arg
list

function (f, lower, upper, ..., subdivisions = 100,
     rel.tol = .Machine$double.eps^0.25,
     abs.tol = rel.tol, stop.on.error = TRUE, keep.xy = FALSE,
     aux = NULL)

(cf args(integrate)).  But the original author did not do it that way.
[The point is that args after ... have to be given in full.]

You can resolve this by explicitly giving abs.tol and aux:

>  integrate(f, 0, 1, abs.tol =1e-4, aux=NULL, a=.5)
1.758178e-18 with absolute error < 2.8e-15

or not using an argument name that has no meaning and is so subject to
mis-matching.

--
Brian D. Ripley,                  ripley at stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595