[Rd] S3 dispatch for S4 subclasses only works if variable "extends" is accessible from global environment

Martin Maechler maechler at stat.math.ethz.ch
Wed Apr 20 10:35:03 CEST 2016


>>>>> Michael Lawrence <lawrence.michael at gene.com>
>>>>>     on Tue, 19 Apr 2016 05:34:41 -0700 writes:

    > Not sure why R_has_methods_attached() exists. Maybe Martin could shed
    > some light on that.

It was to support (via 'classgets' in attrib.c) a very fast

   class(.) <- "<newclass>"

for S4 objects... to be used in  setAs(......)  methods,
e.g., for the Matrix package where you have many classes with
most slots the same, and I would have wanted to be clearly
faster than calling
   new("<newclass>", x=.., y=.., z=.., u=..,v=.. ..)

But that experiment has not finalized, maybe because it was a too hackish idea.

I may have started writing that at a time where we still mostly
thought that it was not possible to have a working S4 R
"environment" where methods was only loaded but not attached.

In conclusion, you can consider R_has_methods_attached as non-existent.


    > On Mon, Apr 18, 2016 at 11:50 PM, Kirill Müller
    > <kirill.mueller at ivt.baug.ethz.ch> wrote:
    >> Thanks for looking into it, your approach sounds good to me. See also
    >> R_has_methods_attached()
    >> (https://github.com/wch/r-source/blob/42ecf5f492a005f5398cbb4c9becd4aa5af9d05c/src/main/objects.c#L258-L265).
    >> 
    >> I'm fine with Rscript not loading "methods", as long as everything works
    >> properly with "methods" loaded but not attached.
    >> 
    >> 
    >> -Kirill
    >> 
    >> 
    >> 
    >> On 19.04.2016 04:10, Michael Lawrence wrote:
    >>> 
    >>> Right, the methods package is not attached by default when running R
    >>> with Rscript. We should probably remove that special case, as it
    >>> mostly just leads to confusion, but that won't happen immediately.
    >>> 
    >>> For now, the S4_extends() should probably throw an error when the
    >>> methods namespace is not loaded. And the check should be changed to
    >>> directly check whether R_MethodsNamespace has been set to something
    >>> other than the default (R_GlobalEnv). Agreed?
    >>> 
    >>> On Mon, Apr 18, 2016 at 4:35 PM, Kirill Müller
    >>> <kirill.mueller at ivt.baug.ethz.ch> wrote:
    >>>> 
    >>>> Scenario: An S3 method is declared for an S4 base class but called for an
    >>>> instance of a derived class.
    >>>> 
    >>>> Steps to reproduce:
    >>>> 
    >>>>> Rscript -e "test <- function(x) UseMethod('test', x); test.Matrix <-
    >>>>> function(x) 'Hi'; MatrixDispatchTest::test(Matrix::Matrix())"
    >>>> 
    >>>> Error in UseMethod("test", x) :
    >>>> no applicable method for 'test' applied to an object of class
    >>>> "lsyMatrix"
    >>>> Calls: <Anonymous>
    >>>> 1: MatrixDispatchTest::test(Matrix::Matrix())
    >>>> 
    >>>>> Rscript -e "extends <- 42; test <- function(x) UseMethod('test', x);
    >>>>> test.Matrix <- function(x) 'Hi';
    >>>>> MatrixDispatchTest::test(Matrix::Matrix())"
    >>>> 
    >>>> [1] "Hi"
    >>>> 
    >>>> To me, it looks like a sanity check in line 655 of src/main/attrib.c is
    >>>> making wrong assumptions, but there might be other reasons.
    >>>> 
    >>>> (https://github.com/wch/r-source/blob/780021752eb83a71e2198019acf069ba8741103b/src/main/attrib.c#L655-L656)
    >>>> 
    >>>> Same behavior in R 3.2.4, R 3.2.5 and R-devel r70420.
    >>>> 
    >>>> 
    >>>> Best regards
    >>>> 
    >>>> Kirill
    >>>> 
    >>>> ______________________________________________
    >>>> R-devel at r-project.org mailing list
    >>>> https://stat.ethz.ch/mailman/listinfo/r-devel
    >>>> 
    >> 
    >> 

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



More information about the R-devel mailing list