[Rd] Interaction between callNextMethod() and selectMethod()
Hervé Pagès
hpages at fhcrc.org
Sat Aug 4 01:24:50 CEST 2012
FWIW, here is my sessionInfo:
> sessionInfo()
R Under development (unstable) (2012-07-25 r59963)
Platform: x86_64-unknown-linux-gnu (64-bit)
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=C LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
BTW, it's funny that the VERSION file in the R source tree says:
hpages at latitude:~/src/R-2.16.r59963$ cat VERSION
2.16.0 Under development (unstable)
^^^^^^
H.
On 08/03/2012 04:18 PM, Hervé Pagès wrote:
> Hi,
>
> Strange things happen. Here is a simple example:
>
> > setClass("A", contains="integer")
> > setMethod("as.matrix", "A", function(x, ...) t(callNextMethod()))
> Creating a generic function for ‘as.matrix’ from package ‘base’ in
> the global environment
> [1] "as.matrix"
> > a <- new("A", 1:3)
> > as.matrix(a)
> [,1] [,2] [,3]
> [1,] 1 2 3
>
> Everything fine so far. But:
>
> > selectMethod("as.matrix", "A")(a)
> Error in callNextMethod() :
> c("a call to callNextMethod() appears in a call to
> \"selectMethod\", but the call does not seem to come from either a
> generic function or another 'callNextMethod'", "a call to
> callNextMethod() appears in a call to \"as.matrix\", but the call does
> not seem to come from either a generic function or another
> 'callNextMethod'", "a call to callNextMethod() appears in a call to
> \"A\", but the call does not seem to come from either a generic function
> or another 'callNextMethod'")
> In addition: Warning message:
> In if (is.na(i)) { :
> the condition has length > 1 and only the first element will be used
>
> 2 things about this:
>
> (1) Sure callNextMethod() needs some context in order to know what to
> do but it seems that the MethodDefinition object returned by
> selectMethod() carries that context i.e. it seems to contain
> all the information that callNextMethod() would need (name of the
> generic and defined signature) to actually work:
>
> > mymethod <- selectMethod("as.matrix", "A")
> > class(mymethod)
> [1] "MethodDefinition"
> attr(,"package")
> [1] "methods"
> > mymethod at generic
> [1] "as.matrix"
> attr(,"package")
> [1] "base"
> > mymethod at defined
> An object of class "signature"
> x
> "A"
>
> (2) If for whatever reason callNextMethod() really needs to fail, could
> the error handling be fixed so it produces the same output as:
>
> > mymethod(a)
> Error in callNextMethod() :
> a call to callNextMethod() appears in a call to "mymethod", but
> the call does not seem to come from either a generic function or another
> 'callNextMethod'
>
> Thanks!
> H.
>
--
Hervé Pagès
Program in Computational Biology
Division of Public Health Sciences
Fred Hutchinson Cancer Research Center
1100 Fairview Ave. N, M1-B514
P.O. Box 19024
Seattle, WA 98109-1024
E-mail: hpages at fhcrc.org
Phone: (206) 667-5791
Fax: (206) 667-1319
More information about the R-devel
mailing list