"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 <akwsi...@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.4...@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@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. ______________________________________________ R-help@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.