Martin Morgan
2012-Aug-05 23:31 UTC
[Rd] setMethod sometimes fails to set package slot when signature has trailing 'ANY'
after this
setClass("A")
setGeneric("bar", function(x, y) standardGeneric("bar"))
setMethod(bar, signature(x="A", y="A"), function(x, y)
{})
setMethod(bar, signature(x="A", y="ANY"), function(x, y)
{})
the method for signature c("A", "A") contains package
information
> str(getMethod(bar, c("A", "A")))
Formal class 'MethodDefinition' [package "methods"] with 4
slots
..@ .Data :function (x, y)
..@ target :Formal class 'signature' [package "methods"]
with 3 slots
.. .. ..@ .Data : chr [1:2] "A" "A"
.. .. ..@ names : chr [1:2] "x" "y"
.. .. ..@ package: chr [1:2] ".GlobalEnv" ".GlobalEnv"
..@ defined:Formal class 'signature' [package "methods"]
with 3 slots
.. .. ..@ .Data : chr [1:2] "A" "A"
.. .. ..@ names : chr [1:2] "x" "y"
.. .. ..@ package: chr [1:2] ".GlobalEnv" ".GlobalEnv"
..@ generic: atomic [1:1] bar
.. ..- attr(*, "package")= chr ".GlobalEnv"
but the method for signature c("A", "ANY") does not
> str(getMethod(bar, c("A", "ANY")))
Formal class 'MethodDefinition' [package "methods"] with 4
slots
..@ .Data :function (x, y)
..@ target :Formal class 'signature' [package "methods"]
with 3 slots
.. .. ..@ .Data : chr [1:2] "A" "ANY"
.. .. ..@ names : chr [1:2] "x" "y"
.. .. ..@ package: chr [1:2] "" ""
..@ defined:Formal class 'signature' [package "methods"]
with 3 slots
.. .. ..@ .Data : chr [1:2] "A" "ANY"
.. .. ..@ names : chr [1:2] "x" "y"
.. .. ..@ package: chr [1:2] "" ""
..@ generic: atomic [1:1] bar
.. ..- attr(*, "package")= chr ".GlobalEnv"
This does not occur when the order of setMethod calls is reversed. The
reason is that the package information added when
methods/R/Methods.R:552 calls matchSignature are stripped (because
matchSignature returns a vector with trailing 'ANY' classes removed) by
the call to .matchSigLength at line 603.
The context for this is the thread starting at
https://stat.ethz.ch/pipermail/bioconductor/2012-August/047241.html
where a complicated package dependency and attempt to redefine an
existing method leads to
Error : package slot missing from signature for generic
'sampleNames<-'
and classes LumiBatch, ANY
cannot use with duplicate class names (the package may need to be
re-installed)
Martin
--
Computational Biology / Fred Hutchinson Cancer Research Center
1100 Fairview Ave. N.
PO Box 19024 Seattle, WA 98109
Location: Arnold Building M1 B861
Phone: (206) 667-2793
Martin Morgan
2012-Aug-07 23:00 UTC
[Rd] setMethod sometimes fails to set package slot when signature has trailing 'ANY'
On 08/07/2012 02:43 PM, John Chambers wrote:> Good catch. This should have been fixed in r-devel, revision 60192. If > nothing bad results in other tests, we'll port it to the current patched > version.Thank you for the fix. Martin> > Thanks, > John > > On 8/5/12 4:31 PM, Martin Morgan wrote: >> after this >> >> setClass("A") >> >> setGeneric("bar", function(x, y) standardGeneric("bar")) >> setMethod(bar, signature(x="A", y="A"), function(x, y) {}) >> setMethod(bar, signature(x="A", y="ANY"), function(x, y) {}) >> >> the method for signature c("A", "A") contains package information >> >> > str(getMethod(bar, c("A", "A"))) >> Formal class 'MethodDefinition' [package "methods"] with 4 slots >> ..@ .Data :function (x, y) >> ..@ target :Formal class 'signature' [package "methods"] with 3 slots >> .. .. ..@ .Data : chr [1:2] "A" "A" >> .. .. ..@ names : chr [1:2] "x" "y" >> .. .. ..@ package: chr [1:2] ".GlobalEnv" ".GlobalEnv" >> ..@ defined:Formal class 'signature' [package "methods"] with 3 slots >> .. .. ..@ .Data : chr [1:2] "A" "A" >> .. .. ..@ names : chr [1:2] "x" "y" >> .. .. ..@ package: chr [1:2] ".GlobalEnv" ".GlobalEnv" >> ..@ generic: atomic [1:1] bar >> .. ..- attr(*, "package")= chr ".GlobalEnv" >> >> but the method for signature c("A", "ANY") does not >> >> > str(getMethod(bar, c("A", "ANY"))) >> Formal class 'MethodDefinition' [package "methods"] with 4 slots >> ..@ .Data :function (x, y) >> ..@ target :Formal class 'signature' [package "methods"] with 3 slots >> .. .. ..@ .Data : chr [1:2] "A" "ANY" >> .. .. ..@ names : chr [1:2] "x" "y" >> .. .. ..@ package: chr [1:2] "" "" >> ..@ defined:Formal class 'signature' [package "methods"] with 3 slots >> .. .. ..@ .Data : chr [1:2] "A" "ANY" >> .. .. ..@ names : chr [1:2] "x" "y" >> .. .. ..@ package: chr [1:2] "" "" >> ..@ generic: atomic [1:1] bar >> .. ..- attr(*, "package")= chr ".GlobalEnv" >> >> This does not occur when the order of setMethod calls is reversed. The >> reason is that the package information added when >> methods/R/Methods.R:552 calls matchSignature are stripped (because >> matchSignature returns a vector with trailing 'ANY' classes removed) >> by the call to .matchSigLength at line 603. >> >> The context for this is the thread starting at >> >> https://stat.ethz.ch/pipermail/bioconductor/2012-August/047241.html >> >> where a complicated package dependency and attempt to redefine an >> existing method leads to >> >> Error : package slot missing from signature for generic 'sampleNames<-' >> and classes LumiBatch, ANY >> cannot use with duplicate class names (the package may need to be >> re-installed) >> >> Martin >-- Computational Biology / Fred Hutchinson Cancer Research Center 1100 Fairview Ave. N. PO Box 19024 Seattle, WA 98109 Location: Arnold Building M1 B861 Phone: (206) 667-2793
John Chambers
2012-Aug-08 08:51 UTC
[Rd] setMethod sometimes fails to set package slot when signature has trailing 'ANY'
Good catch. This should have been fixed in r-devel, revision 60192. If nothing bad results in other tests, we'll port it to the current patched version. Thanks, John On 8/5/12 4:31 PM, Martin Morgan wrote:> after this > > setClass("A") > > setGeneric("bar", function(x, y) standardGeneric("bar")) > setMethod(bar, signature(x="A", y="A"), function(x, y) {}) > setMethod(bar, signature(x="A", y="ANY"), function(x, y) {}) > > the method for signature c("A", "A") contains package information > > > str(getMethod(bar, c("A", "A"))) > Formal class 'MethodDefinition' [package "methods"] with 4 slots > ..@ .Data :function (x, y) > ..@ target :Formal class 'signature' [package "methods"] with 3 slots > .. .. ..@ .Data : chr [1:2] "A" "A" > .. .. ..@ names : chr [1:2] "x" "y" > .. .. ..@ package: chr [1:2] ".GlobalEnv" ".GlobalEnv" > ..@ defined:Formal class 'signature' [package "methods"] with 3 slots > .. .. ..@ .Data : chr [1:2] "A" "A" > .. .. ..@ names : chr [1:2] "x" "y" > .. .. ..@ package: chr [1:2] ".GlobalEnv" ".GlobalEnv" > ..@ generic: atomic [1:1] bar > .. ..- attr(*, "package")= chr ".GlobalEnv" > > but the method for signature c("A", "ANY") does not > > > str(getMethod(bar, c("A", "ANY"))) > Formal class 'MethodDefinition' [package "methods"] with 4 slots > ..@ .Data :function (x, y) > ..@ target :Formal class 'signature' [package "methods"] with 3 slots > .. .. ..@ .Data : chr [1:2] "A" "ANY" > .. .. ..@ names : chr [1:2] "x" "y" > .. .. ..@ package: chr [1:2] "" "" > ..@ defined:Formal class 'signature' [package "methods"] with 3 slots > .. .. ..@ .Data : chr [1:2] "A" "ANY" > .. .. ..@ names : chr [1:2] "x" "y" > .. .. ..@ package: chr [1:2] "" "" > ..@ generic: atomic [1:1] bar > .. ..- attr(*, "package")= chr ".GlobalEnv" > > This does not occur when the order of setMethod calls is reversed. The > reason is that the package information added when > methods/R/Methods.R:552 calls matchSignature are stripped (because > matchSignature returns a vector with trailing 'ANY' classes removed) > by the call to .matchSigLength at line 603. > > The context for this is the thread starting at > > https://stat.ethz.ch/pipermail/bioconductor/2012-August/047241.html > > where a complicated package dependency and attempt to redefine an > existing method leads to > > Error : package slot missing from signature for generic 'sampleNames<-' > and classes LumiBatch, ANY > cannot use with duplicate class names (the package may need to be > re-installed) > > Martin