[R] A technical question on methods for "+"

Bert Gunter
2021-12-02T20:22:59Z

"This is because + dispatches on the class attribute, which a string
like "test" has set to NULL"
Not true.

> class('test')
[1] "character"

But apparently, as Denes and Jeff said, the class must be explicitly
set, rather than relying on its built-in/implicit type.

With the above hint, I looked up what ?class had to say. It is:

"Note that for objects x of an implicit (or an S4) class, when a (S3)
generic function foo(x) is called, method dispatch may use more
classes than are returned by class(x), e.g., for a numeric matrix, the
foo.numeric() method may apply. The exact full character vector of the
classes which UseMethod() uses, is available as .class2(x) since R
version 4.0.0. (This also applies to S4 objects when S3 dispatch is
considered, see below.)"

I think this is the "official" explanation, but I find it rather
opaque.

Thanks to all for your Help in finding the explanation. Much appreciated.

Bert

On Thu, Dec 2, 2021 at 12:10 PM Andrew Simmons <akwsimmo at gmail.com>
wrote:
>
> This is because + dispatches on the class attribute, which a string like
"test" has set to NULL, so it doesn't dispatch. You can add the
class yourself like structure("test", class = "character")
and that should work.
>
> I'm not sure where it's explained, but most primitive functions
dispatch on the class attribute, which is different from UseMethod which calls
class() if the class attribute is NULL.
>
> I think if you want to define something like what you have written, you
could write a function `%+%` use that instead
>
> On Thu, Dec 2, 2021, 14:32 Bert Gunter <bgunter.4567 at gmail.com>
wrote:
>>
>> ... and probably a dumb one and almost certainly not of interest to
>> most R users. But anyway...
>>
>> ?"+" says:
>> "The unary and binary arithmetic operators are generic functions:
>> methods can be written for them individually or via the Ops group
>> generic function. "
>>
>> So:
>> "+.character" <- function(e1, e2) paste0(e1, e2)
>> ## but this doesn't 'work':
>> > "a" + "b"
>> Error in "a" + "b" : non-numeric argument to binary
operator
>>
>> ## but explicitly invoking the method does 'work' :
>> > "+.character"('a','b')
>> [1] "ab"
>>
>> ##Note also:
>> > methods("+")
>> [1] +.character +.Date      +.IDate*    +.POSIXt    +.trellis*
>>
>> So what am I failing to understand?
>> Thanks.
>>
>> Bert Gunter
>>
>> ______________________________________________
>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide
http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.