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. >[[alternative HTML version deleted]]
"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.
The reason for this behaviour is that finding methods is a lot slower than just evaluating the built-in function. So R takes the time to determine if there's an attribute named "class" attached, but doesn't go searching further if there isn't one. Duncan Murdoch On 02/12/2021 3:10 p.m., Andrew Simmons 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. >> > > [[alternative HTML version deleted]] > > ______________________________________________ > 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. >