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

Andrew Simmons @kw@|mmo @end|ng |rom gm@||@com
Thu Dec 2 21:30:20 CET 2021


class() does not always return the class attribute, try something more like
attr(, "class"), you'll see what I mean

On Thu, Dec 2, 2021, 15:23 Bert Gunter <bgunter.4567 using gmail.com> wrote:

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

	[[alternative HTML version deleted]]



More information about the R-help mailing list