[R-pkg-devel] "apparent S3 methods" note in R CMD check

John Fox jfox at mcmaster.ca
Fri Jun 12 12:38:17 CEST 2015


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