[Rd] an unpleasant interaction of environments and generic functions

Uwe Ligges ligges at statistik.uni-dortmund.de
Wed Feb 1 08:49:51 CET 2006


Ross Boylan wrote:

> I've run into an unpleasant oddity involving the interaction of
> environments and generic functions.  I want to check my diagnosis, and
> see if there is a good way to avoid the problem.
> 
> Problem:
> A library defines
> "foo" <- function(object) 1
> setMethod("foo", c("matrix"), function(object) 30)
> 
> After loading the library
> foo(0) is 1
> foo(matrix()) is 30
> foo is a generic
> 
> The source the file with the code given above.
> Now 
> foo(matrix()) is 1
> foo is a function
> (Also, there is no "creating generic function" message).
> 
> Diagnosis:
> The library creates foo and related generics in package:libname.
> The source for the initial definition puts the name and function
> definition in .GlobalEnv.
> The source'd setMethod finds the existing generic in package:libname and
> updates it (I'm not sure about this last step).
> foo then discovers the foo in .GlobalEnv, not the generic, so the
> generic and the alternate methods are hidden.
> 
> In case you're wondering, I found this out because I was experimenting
> with a library, changing the R and not the C code.  I get sick of doing
> R CMD INSTALL with each iteration, but needed to load the library to get
> the .so file.
> 
> So, is my diagnosis correct?
> 
> Any suggestions about how to avoid this problem?
> Maybe sys.source("file", 2)... Seems to work!


I'd suggest to dyn.load() the .so and source() the code during early 
development. So you do not need to R CMD INSTALL the _*package*_ into a 
library.

Uwe Ligges



More information about the R-devel mailing list