[R] A technical question on methods for "+"
@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')
>  "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.
> 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')
> >>  "ab"
> >> ##Note also:
> >> > methods("+")
> >>  +.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
> >> and provide commented, minimal, self-contained, reproducible code.
[[alternative HTML version deleted]]
More information about the R-help