[R] variable names when using S3 methods

Peter Dalgaard P.Dalgaard at biostat.ku.dk
Mon Apr 28 14:12:32 CEST 2008


Aaron Rendahl wrote:
> I'm seeing some funny behavior when using methods (the older S3 type)
> and having variables that start with the same letter.  I have a vague
> recollection of reading something about this once but now can't seem
> to find anything in the documentation.  Any explanation, or a link to
> the proper documentation, if it does exist, would be appreciated.
>
> Thanks, Aaron Rendahl
> University of Minnesota School of Statistics
>
>
> # set up two function that both use method "foo" but with different
> variable names
> fooA<-function(model,...)
>     UseMethod("foo")
> fooB<-function(Bmodel,...)
>     UseMethod("foo")
>
> # now set up two methods (default and character) that have an
> additional variable
> foo.character <- function(model, m=5,...)
>     cat("foo.character: m is", m, "\n")
> foo.default <- function(model, m=5,...)
>     cat("foo.default: m is", m, "\n")
>
> # both of these use foo.character, as expected
> fooA("hi")
> fooB("hi")
>
> # but here, fooA uses foo.default instead
> fooA("hi",m=1)
> fooB("hi",m=1)
>
> # additionally, these use foo.character, as expected
> fooA("hi",1)
> fooA(model="hi",m=1)
This is partial matching on argument names, a feature regretted by its
designers, but a feature nevertheless.

It has nothing to do with S3 as such, it is just that fooA("hi",m=1)
matches "m" to "model" and believes that you meant fooA("hi", model=1).

It often bites people in S3 methods though, because in most other cases,
you can put the arguments after "..." where they require exact matching
(consider the naming forms of c() and cbind(), for instance).

-- 
   O__  ---- Peter Dalgaard             Øster Farimagsgade 5, Entr.B
  c/ /'_ --- Dept. of Biostatistics     PO Box 2099, 1014 Cph. K
 (*) \(*) -- University of Copenhagen   Denmark      Ph:  (+45) 35327918
~~~~~~~~~~ - (p.dalgaard at biostat.ku.dk)              FAX: (+45) 35327907



More information about the R-help mailing list