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
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
setMethod() woes
2 messages · robin hankin, John Chambers
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 at r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel