[R-pkg-devel] "apparent S3 methods" note in R CMD check
Martin Maechler
maechler at stat.math.ethz.ch
Sat Jun 13 09:31:22 CEST 2015
>>>>> Uwe Ligges <ligges at statistik.tu-dortmund.de>
>>>>> on Fri, 12 Jun 2015 22:58:17 +0200 writes:
> On 12.06.2015 18:22, Roebuck,Paul L wrote:
>> Actually, between this and other things coming from 'R
>> CMD check' these days, I disagree that this is reasonable
>> at all - it's a hack
> Why a hack? I am not sure what the right mechanism is, but
> here the check is not the problem but it uncovers the
> problem that the function is actually used as an S3 ethod
> although it is not.
Indeed. It's really the contrary of hack, namely trying to solve
the underlying problem:
This has been a proposition that is much more than just a way to turn
off some warnings or notes. It's about a possible improvement in
R in how functions are made into S3 methods, namely allowing at least
for R code in package namespaces (but maybe even outside) to say
that a given <fn>.<class> function should *not* be seen as an
S3 method of function <fn> for class <class> .
But please follow up on R-devel -- there's a full thread there.
This list is about helping programmeRs develop their packages ..
Martin
> at best that only fixes this particular issue. Better would be
> to introduce lint-like directives that turn off certain R CMD
> check notes/warnings at different scopes (e.g., #pylint:
> disable=some-message,another-one) rather than introduce
> individual workarounds. Would give us an extensible version of
> the "--no-nanny" option Kevin wants.
>
>
> On 6/12/15 5:38 AM, "John Fox" <jfox at mcmaster.ca> wrote:
>
>> Dear Martin,
>>
>> Thank you for addressing this issue. Introducing a nonS3method()
>> directive in NAMESPACE
>> seems a reasonable solution. It could replace export() for functions with
>> "."s in their names.
>>
>> Best,
>> John
>>
>> On Fri, 12 Jun 2015 09:55:18 +0200
>> Martin Maechler <maechler at stat.math.ethz.ch> wrote:
>>>>>>>> John Fox <jfox at mcmaster.ca>
>>>>>>>> on Wed, 10 Jun 2015 10:12:46 -0400 writes:
>>>
>>> > Dear list members,
>>> > One of the packages I maintain, effects, generates the following
>>> note in R
>>> > CMD check:
>>>
>>> > * checking S3 generic/method consistency ... NOTE
>>> > Found the following apparent S3 methods exported but not
>>> registered:
>>> > all.effects
>>>
>>> > The offending function, all.effects(), is deprecated in favour of
>>> > allEffects(), but I'd rather not get rid of it for backwards
>>> compatibility.
>>> > Is there any way to suppress the note without removing
>>> all.effects()?
>>>
>>> > To be clear, all.effects() is *not* a method of all(), and is
>>> defined as
>>>
>>> >> effects::all.effects
>>> > function (...)
>>> > {
>>> > .Deprecated("allEffects")
>>> > allEffects(...)
>>> > }
>>>
>>> Dear John,
>>> this is a good question without an obvious answer for the
>>> moment.
>>>
>>> The check producing it is relatively new *and* has helped to
>>> detect problems in many packages and places, but I would agree
>>> is a "False Positive" in this case.
>>>
>>> One reason for such a check is the following output {in R >= 3.2.0},
>>>
>>> > require("effects")
>>> Loading required package: effects
>>> > methods(all)
>>> [1] all,ddiMatrix-method all,ldiMatrix-method
>>> all,lsparseMatrix-method
>>> [4] all,Matrix-method all,nsparseMatrix-method all.effects
>>>
>>> see '?methods' for accessing help and source code
>>> >
>>>
>>> which wrongly does list your all.effects() among the all
>>> methods.... and indeed (even worse), it *is* taken as S3 method
>>> for all():
>>>
>>> > ex <- structure(FALSE, class="effects")
>>> > all(ex)
>>> Error: $ operator is invalid for atomic vectors
>>> In addition: Warning message:
>>> 'all.effects' is deprecated.
>>> Use 'allEffects' instead.
>>> See help("Deprecated")
>>> >
>>>
>>> ---
>>>
>>> Now I agree .. and have e-talked about this with another R core
>>> member .. that it would be desirable for the package author to
>>> effectively declare the fact that such a function is not an S3
>>> method even though it "looks like it" at least if looked from far.
>>>
>>> So, ideally, you could have something like
>>>
>>> nonS3method("all.effects")
>>>
>>> somewhere in your package source ( in NAMESPACE or R/*.R )
>>> which would tell the package-checking code -- but *ALSO* all the other
>>> S3
>>> method code that all.effects should be treated as a regular R
>>> function.
>>>
>>> I would very much like such a feature in R, and for that reason,
>>> I'm cross posting this (as one of the famous exceptions that
>>> accompany real-life rules!!) to R-devel.
>>>
>>> There is one current work-around -- some would say "hack" -- in the R
>>> sources for exceptions on a per package basis, and I will now activate
>>> that workaround for you.
>>>
>>> Martin
More information about the R-package-devel
mailing list