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

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


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.duncan using 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.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.
> >>
> >
> >       [[alternative HTML version deleted]]
> >
> > ______________________________________________
> > 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