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

Peter Dalgaard
Sat, 29 Jan 2005 18:20:32 -0000

Graham Jones <maillists at visiv.co.uk> writes:

> 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?

It's mainly a design issue. Had the "..." in the definition of
integrate been further to the left, then your problem wouldn't exist,
but you wouldn't be able to use abbreviations for abs.tol and friends.

A simple (if tedious) workaround is

integrate(f, 0, 1, a=.5, abs.tol=.Machine$double.eps^0.25, aux=NULL)

a more thoroughly effective one could be

myintegrate <- 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)
 integrate(f, lower, upper, subdivisions, rel.tol, abs.tol,
             stop.on.error, keep.xy, aux, ...)


--
   O__  ---- Peter Dalgaard             Blegdamsvej 3
  c/ /'_ --- Dept. of Biostatistics     2200 Cph. N
 (*) \(*) -- University of Copenhagen   Denmark      Ph: (+45) 35327918
~~~~~~~~~~ - (p.dalgaard at biostat.ku.dk)             FAX: (+45) 35327907