That's an interesting solution too.
-----Original Message-----
From: Duncan Murdoch <[email protected]>
Sent: Friday, January 17, 2020 11:17 AM
To: Smith, Brian J <[email protected]>; [email protected]
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 <[email protected]>
> Sent: Friday, January 17, 2020 9:24 AM
> To: Smith, Brian J <[email protected]>;
> [email protected]
> 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: [email protected]
>>
>> ______________________________________________
>> [email protected] mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-package-devel
>>
>
______________________________________________
[email protected] mailing list
https://stat.ethz.ch/mailman/listinfo/r-package-devel