That's an interesting solution too.

-----Original Message-----
From: Duncan Murdoch <murdoch.dun...@gmail.com> 
Sent: Friday, January 17, 2020 11:17 AM
To: Smith, Brian J <brian-j-sm...@uiowa.edu>; r-package-devel@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.dun...@gmail.com>
> Sent: Friday, January 17, 2020 9:24 AM
> To: Smith, Brian J <brian-j-sm...@uiowa.edu>; 
> r-package-devel@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-sm...@uiowa.edu
>>
>> ______________________________________________
>> R-package-devel@r-project.org mailing list 
>> https://stat.ethz.ch/mailman/listinfo/r-package-devel
>>
> 

______________________________________________
R-package-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-package-devel

Reply via email to