[Rd] Overriding S4 methods in an installed package

Duncan Murdoch murdoch at stats.uwo.ca
Sat Aug 18 22:02:58 CEST 2007

Allen McIntosh wrote:
> Seth Falcon wrote:
>> Allen McIntosh <mcintosh at research.telcordia.com> writes:
>>> Is it possible to override S4 methods in an installed package?
>>> The naive
>>> library("pkg")
>>> setMethod("foo", signature(obj = "bar"),
>>>         function(obj , x, y) { new definition }
>>> 	, where="package:pkg")
>>> results in the error
>>> Error in setMethod("foo", signature(obj = "bar"), function(obj,  :
>>>         the environment "pkg" is locked; cannot assign methods for function "foo"
>> If foo is a generic that you are calling directly, then you can
>> probably define it in the global environment (omit the where arg) and
>> test it that way.
>> OTOH, if foo is used by pkg internally, then it will be much easier to
>> simply edit the source for pkg, reinstall and test.  If you find and
>> fix a bug, most package maintainers will be quite happy to integrate
>> your fix.
> Thanks for the suggestion.  Unfortunately, foo() uses internal 
> functions.  When foo() is defined in the global environment, these are 
> not visible.
I think you can set the environment of your method to see the package 
internals.  Those internals won't see your method, though.

To do this, you'd do something like

newfoo <- function(obj , x, y) { new definition }
environment(newfoo) <- environment(foo) # or some other function from 
the package

setMethod("foo", signature(obj = "bar"),

> I was hoping to avoid recompiling and installing under Windows.  Looks 
> like I may not have a choice.
This is getting easier:  we're down to a single install, as long as you 
don't need all possible formats of man pages.

Duncan Murdoch
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel

More information about the R-devel mailing list