[R-pkg-devel] [External] Re: S3 generic/method consistency warning for formula method

Smith, Brian J br|@n-j-@m|th @end|ng |rom u|ow@@edu
Fri Jan 17 19:30:40 CET 2020


That's an interesting solution too.

-----Original Message-----
From: Duncan Murdoch <murdoch.duncan using gmail.com> 
Sent: Friday, January 17, 2020 11:17 AM
To: Smith, Brian J <brian-j-smith using uiowa.edu>; r-package-devel using r-project.org
Subject: Re: [External] Re: [R-pkg-devel] S3 generic/method consistency warning for formula method

On 17/01/2020 10:59 a.m., Smith, Brian J wrote:
> Thanks Duncan.
> 
> I was surprised too when first realizing this was possible.  I believe the reason it works is that UseMethod dispatches on the first supplied argument by default.  So, really the dispatch is on the first element of the ellipsis.  The 'c' function works like this, albeit as a primitive function.
> 
> I would like to dispatch on the ellipsis to allow a user to name values being passed in.  Defining an initial x argument would indeed eliminate the warning, but would not allow for user-naming of the value.  I could have the user pass a list of values to x and do dispatching manually, but that seems like more steps for the user and more complication for the implementation than ought to be necessary.  There are other downsides to that approach in my particularly application...

I think you can still do that, if your generic looks like this:

foo <- function(x, ...) {
   if (missing(x))
     UseMethod("foo", ..1)
   else
     UseMethod("foo")
}

and your methods look like this one:

foo.numeric <- function(x, ...) if (missing(x)) list(...) else list(x, ...)

There are some negatives to this solution:

  - it's more complicated than what you have
  - foo() now doesn't work unless you make it even more complicated
  - the name x is now special; foo("a", 1) will now dispatch to a different method than foo(w = "a", x = 1).  This is getting into the "world of hurt" that Joris mentioned.

The benefits are non-trivial:

  - It should make that warning go away
  - It doesn't depend on undocumented behaviour.

Duncan Murdoch

> 
> The issue mentioned below about calling the function with no arguments can be solved by defining the following default method.
> 
> foo.default <- function(...) list(...)
> 
> -----Original Message-----
> From: Duncan Murdoch <murdoch.duncan using gmail.com>
> Sent: Friday, January 17, 2020 9:24 AM
> To: Smith, Brian J <brian-j-smith using uiowa.edu>; 
> r-package-devel using r-project.org
> Subject: [External] Re: [R-pkg-devel] S3 generic/method consistency 
> warning for formula method
> 
> On 17/01/2020 9:14 a.m., Smith, Brian J wrote:
>> Hello all,
>>
>> I am getting an R CMD check warning about S3 consistency for a formula method of a generic function that dispatches on the ellipsis argument.  The formula method seems to function properly when called, and methods for other types tried do not trigger the warning.  Below is an example generic function 'foo' and methods that will reproduce the issue, followed by the check warning message produced.
>>
>> foo <- function(...) UseMethod("foo") foo.factor <- function(...) 
>> list(...) foo.formula <- function(...) list(...) foo.logical <- 
>> function(...)
>> list(...) foo.matrix <- function(...) list(...) foo.numeric <-
>> function(...) list(...)
> 
> I'm surprised that you are allowed to have a generic with no arguments 
> except "...".  I imagine the error will go away if you change the 
> definitions to
> 
> foo <- function(x, ...) UseMethod("foo") foo.factor <- function(x, 
> ...) list(x, ...) foo.formula <- function(x, ...) list(x, ...) 
> foo.logical <- function(x, ...) list(x, ...) foo.matrix <- function(x, 
> ...) list(x, ...) foo.numeric <- function(x, ...) list(x, ...)
> 
> With your original definition, it would be legal to call foo(), but 
> the
> UseMethod() would fail.
> 
> Duncan Murdoch
> 
>>
>> R CMD check warning:
>>
>> W  checking S3 generic/method consistency (1.7s)
>>      foo:
>>        function(...)
>>      foo.formula:
>>        function(...)
>>      
>>      See section 'Generic functions and methods' in the 'Writing R
>>      Extensions' manual.
>>
>> I would appreciate any help in understanding and addressing this check warning.
>>
>> Thank you,
>> Brian
>>
>> *****************************************************************
>> Brian J Smith, PhD
>> Professor, Department of Biostatistics Director, Biostatistics Core, 
>> Holden Comprehensive Cancer Center The University of Iowa
>> 145 North Riverside Drive, N311 CPHB
>> Phone: 319-384-1587
>> Email: brian-j-smith using uiowa.edu
>>
>> ______________________________________________
>> R-package-devel using r-project.org mailing list 
>> https://stat.ethz.ch/mailman/listinfo/r-package-devel
>>
> 



More information about the R-package-devel mailing list