Those are both helpful comments. Would it not be useful to say something along these lines in ?class. ? The key point I missed is that there often(but not always) must be an *explicit* class **attribute** for method dispatch; and class() does not indicate whether its value is explicit or not (just recapitulating what you both said). Ops methods are such a case (for anything but classes inheriting from numeric?), and perhaps a mention there might be useful, too.
Again, thanks for the help. Bert On Thu, Dec 2, 2021 at 12:40 PM Duncan Murdoch <murdoch.dun...@gmail.com> wrote: > > 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.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. > >> > > > > [[alternative HTML version deleted]] > > > > ______________________________________________ > > 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.