From lawrence.michael at gene.com  Tue Apr 19 14:34:41 2016
From: lawrence.michael at gene.com (Michael Lawrence)
Date: Tue, 19 Apr 2016 05:34:41 -0700
Subject: [Rd] S3 dispatch for S4 subclasses only works if variable
 "extends" is accessible from global environment
In-Reply-To: <5715D528.6030101@ivt.baug.ethz.ch>
References: <57156F2B.4000205@ivt.baug.ethz.ch>
	<CAOQ5NyfK-67N6yHgdP-_Nr8=i34d7zkiR9J6OYFnCtN6_A=fjA@mail.gmail.com>
	<5715D528.6030101@ivt.baug.ethz.ch>
Message-ID: <CAOQ5NyfBrX=DUVdf66g5fWeubnqNUeaT-yJYYiuQB2-MkHk1Xw@mail.gmail.com>

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

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
>>>
>
>



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