From l@wrence@mich@el @ending from gene@com  Thu May 24 20:06:48 2018
From: l@wrence@mich@el @ending from gene@com (Michael Lawrence)
Date: Thu, 24 May 2018 11:06:48 -0700
Subject: [Rd] Creating S3 methods for S4 classes (coming from
 r-package-devel)
In-Reply-To: <CAO1zAVY8Bvwfwq80b7Pk5-2dnpdwGCtw7MXf9_izPgkEa_chKg@mail.gmail.com>
References: <CAO1zAVZUQukdm1Dr-428wDZ-g-ySgsTByKv-XUZ8cJihi0+Oyw@mail.gmail.com>
 <CAOQ5NydMkLr9NP-Q+BZUyA=1seT-_t5khnXbe7uh0e1qn+7xsQ@mail.gmail.com>
 <CAO1zAVY8Bvwfwq80b7Pk5-2dnpdwGCtw7MXf9_izPgkEa_chKg@mail.gmail.com>
Message-ID: <CAOQ5NydBhcgTQregbxA=Are7iEcAgeoYbP9VjfdBLu6c1YZZMg@mail.gmail.com>

On Thu, May 24, 2018 at 10:47 AM, Joris Meys <jorismeys at gmail.com> wrote:
>
>
> On Thu, May 24, 2018 at 6:20 PM, Michael Lawrence
> <lawrence.michael at gene.com> wrote:
>>
>> You only have to make an S4 method if there is already an S4 generic.
>> If there is just an S3 generic, then just define S3 methods on it.
>
>
> I was refering to the recommendations in ?Methods_for_S3
> (https://stat.ethz.ch/R-manual/R-devel/library/methods/html/Methods_for_S3.html).
> :
>
> "Two possible mechanisms for implementing a method corresponding to an S4
> class, there are two possibilities are to register it as an S3 method with
> the S4 class name or to define and set an S4 method, which will have the
> side effect of creating an S4 generic version of this function.
>
> For most situations either works, but the recommended approach is to do
> both:"
>
> The reasoning is described there as well, and I have no reason to believe
> that information is not up to date. I can get away with defining an S3
> generic, but this stops being useful when using superclasses for reasons
> mentioned in the documentation.
>

The reason for having an S4 method is that if there is an S4 generic,
an S4 method (potentially on a superclass) will take precedence. But
if there is no S4 generic, then there are no S4 methods.

It is possible for another package to create an S4 generic. In that
case it would be defensive to define another generic locally. If they
use the same implicit generic, then it should be merged with the local
generic, and things should work. But that is assuming a lot. It would
be preferable for no package to define an S4 generic for predict(),
since there is no reason for it, and it only complicates things.

>
>> I
>> think we should stay away from defining S4 generics when there is no
>> good reason for them. Good reasons include multiple dispatch, or a
>> non-default signature. Neither of those apply in this case.
>
>
> I would personally prefer to use dispatching that's tailored to the type of
> class I work with, as that seems more consistent. But I agree we should
> avoid defining generics for the same function in different packages, hence
> my proposal about stats4.
>

Single dispatch should be consistent between S3 and S4. I think we
should keep things simple and just have one generic, the one we
already have.

>
> --
> Joris Meys
> Statistical consultant
>
> Department of Data Analysis and Mathematical Modelling
> Ghent University
> Coupure Links 653, B-9000 Gent (Belgium)
>
> -----------
> Biowiskundedagen 2017-2018
> http://www.biowiskundedagen.ugent.be/
>
> -------------------------------
> Disclaimer : http://helpdesk.ugent.be/e-maildisclaimer.php



[Rd] Creating S3 methods for S4 classes (coming from r-package-devel)
Michael Lawrence