Re: [Rd] setMethod() woes

From: John Chambers <jmc_at_r-project.org>
Date: Fri 15 Sep 2006 - 14:40:44 GMT

The document on developer.r-project.org/howMethodsWork.pdf explains why the two methods are equally close. Please (re)read it.

If you know what methods you want for mixing the two objects, you must either say so or arrange the classes in an inheritance that includes both classes.

Robin Hankin wrote:
> Hello everybody
>
> R version 2.4.0 alpha (2006-09-15 r39323), MacOSX 10.4.7
>
>
> Next S4 problem.
>
> I have "brob" objects that are large real numbers, and now I want "glub"
> numbers that are to be a pair of glubs that represent complex numbers.
>
> I want to define binary operator "+" so that if either the left or right
> argument are glubs, it uses .ArithGlub.
>
> If either argument is a brob (but neither is a glub), use .ArithGlub
>
You don't mean what you just said, presumably ".ArithBrob"

But this is not specifiable as a method signature unless you create a "brobOrGlub" class. This is a Do What I Mean.
> If neither is a brob or a glub, use standard "+"
>
> (just like real/complex "+").
>
> My attempt (self contained, minimal) is included below.
> But, with this, the following session shows that something is wrong:
>
>
>
> > a <- new("brob",x=1:5,positive=rep(T,5))
> > b <- new("glub",real=a,imag=a)
> > a+b
> Error in a + b : binary operator " + " not defined for Brobdingnagian
> numbers
> In addition: Warning message:
> Ambiguous method selection for "+", target "brob#glub" (the first of
> the signatures shown will be used)
> brob#ANY
> ANY#glub
> in: .findInheritedMethods(classes, fdef, mtable)
>
>
>
> I don't understand what to do to avoid getting the warning
> message [and it's also using the wrong function: I want it
> to call .ArithGlub() here, not .ArithBrob() ]
>
> I need to use signature(e1="brob", e2="anything except a glub")
> but I can't figure out how to do this.
>
>
>
>
>
>
>
> setClass("brob",
> representation = representation
> (x="numeric",positive="logical"),
> prototype = list(x=numeric(),positive=logical())
> )
>
> setClass("glub",
> representation = representation(real="brob",imag="brob"),
> prototype = list(real=new("brob"), imag=new("brob"))
> )
>
> .ArithBrob <- function(e1,e2){
> stop(paste("binary operator \"", .Generic, "\" not defined for
> Brobdingnagian numbers"))
> }
>
> .ArithGlub <- function(e1,e2){
> stop(paste("binary operator \"", .Generic, "\" not defined for
> Glub numbers"))
> }
>
> setMethod("Arith",signature(e1 = "brob", e2="brob"), .ArithBrob)
> setMethod("Arith",signature(e1 = "brob", e2="ANY" ), .ArithBrob)
> setMethod("Arith",signature(e1 = "ANY" , e2="brob"), .ArithBrob)
>
> setMethod("Arith",signature(e1 = "glub"), .ArithGlub)
> setMethod("Arith",signature(e2 = "glub"), .ArithGlub)
>
>
>
>
>
>
>
> --
> Robin Hankin
> Uncertainty Analyst
> National Oceanography Centre, Southampton
> European Way, Southampton SO14 3ZH, UK
> tel 023-8059-7743
>
> ______________________________________________
> R-devel@r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>
>



R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel Received on Sat Sep 16 00:42:51 2006

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.1.8, at Fri 15 Sep 2006 - 17:30:16 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-devel. Please read the posting guide before posting to the list.