[Bioc-devel] avoiding clashes of different S4 methods with the same generic
Aaron Lun
alun at wehi.edu.au
Tue Apr 26 20:00:49 CEST 2016
Dear List,
When a S4 method for the same class is defined in two separate packages
(i.e., under the same generic), and both packages are loaded into a R
session, it seems that the method from the package loaded later clobbers
the method from the package loaded first. Is it possible to specifically
call the method in the first package when both packages are loaded? If
not, how should we protect against this?
To give some context; the csaw package currently defines a normalize()
method for SummarizedExperiment objects, using the generic from
BiocGenerics. However, if some other hypothetical package (I'll call it
"swings", for argument's sake) were to define a normalize() method with
a SE signature, and if the swings package were to be loaded after csaw,
then it seems that all calls to normalize() would use the method defined
by swings, rather than that defined by csaw.
Now, for usual functions, disambiguation would be easy with "::", but I
don't know whether this can be done in the S4 system, given that the
details of dispatch are generally hidden away. The only solution I can
see is for csaw (and/or swings) to define a SE subclass; define the
normalize() method using the subclass as the signature, such that S4
dispatch will now go to the correct method; and hope that no other
package redefines normalize() for the subclass.
Is this what I should be doing routinely, i.e., define subclasses and
methods for those subclasses in all my packages? Or am I missing
something obvious? I would have expected such clashes to be more of a
problem, given how many new packages are being added to BioC at every
release.
Cheers,
Aaron
More information about the Bioc-devel
mailing list