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

Bert Gunter bgunter@4567 @end|ng |rom gm@||@com
Thu Dec 2 21:22:59 CET 2021

"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.


On Thu, Dec 2, 2021 at 12:10 PM Andrew Simmons <akwsimmo using 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 using 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 using 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.

More information about the R-help mailing list