Having problem to define a subclass, please help me
Dear all, apart from my previous question, I would also like to ask one more question here, which is as follows:
#let me 1st define a class and a subclass
setClass("a", representation=list(x="numeric", y="numeric"), prototype=list(x=rep(1,3),y=rep(2,3)))
setClass("b", representation=list(x1="character", y1="character"), prototype=list(x1=rep("A",3),y1=rep("B",3)), contains="a")
#Now I define the method for initialize() for class "a"
setMethod("initialize", "a", function(.Object, x, y, ...) {
if (length(x) != length(y)) x=y=rep(10,4)
.Object at x = x
.Object at y = y
.Object })
new("a", x=rnorm(4), y=rnorm(4))
new("a", x=rnorm(4), y=rnorm(3))
#Next I define method for initialize() for subclass "b"
setMethod("initialize", "b", function(.Object, x1, y1, ...) {
if (length(x1) == length(y1)) x1=y1=rep("bbb",4)
.Object at x1 = x1
.Object at y1 = y1
.Object })
new("b", x1=letters[1:3], x2=letters[2:4], x=rnorm(4), y=rnorm(3))
An object of class "b" Slot "x1": [1] "bbb" "bbb" "bbb" "bbb" Slot "y1": [1] "bbb" "bbb" "bbb" "bbb" Slot "x": [1] 1 1 1 Slot "y": [1] 2 2 2
new("b", x1=letters[1:3], x2=letters[2:4], x=rnorm(4), y=rnorm(4))
Error in checkSlotAssignment(object, name, value) : assignment of an object of class "numeric" is not valid for slot "y1" in an object of class "b"; is(value, "character") is not TRUE Here my questions are: 1. Why I am getting the prototype object in next to previous example for slots x & y? 2. Why just previous example generates some error? 3. The method initialize() function for a subclass requires explicit description of all slots of it's superclass? If yes why? In my understanding, all defined law for super-class should be inherited by it's sub-class, therefore no need to define again. I would be really grateful if someone clarify those. Thanks
--- On Fri, 7/30/10, Megh Dal <megh700004 at yahoo.com> wrote:
From: Megh Dal <megh700004 at yahoo.com> Subject: Having problem to define a subclass, please help me To: r-help at stat.math.ethz.ch Date: Friday, July 30, 2010, 4:46 PM Here I am having problem to define a subclass, specially if I define that subclass after defining initialize() method for its superclass. Here is my code:
setClass("a", representation=list(x="numeric",
y="numeric"), prototype=list(x=rnorm(10), y=rnorm(10))) [1] "a"
setMethod("initialize", "a", function(.Object, x, y,
...) {
+? ? ? ? ? ? ? ?
? ? ? ? ? ? ?
???if (length(x) != length(y)) x = y = rep(5,
4)
+? ? ? ? ? ? ? ?
? ? ? ? ? ? ?
???.Object at x = x
+? ? ? ? ? ? ? ?
? ? ? ? ? ? ?
???.Object at y = y
+? ? ? ? ? ? ? ?
? ? ? ? ? ? ?
???.Object })
[1] "initialize"
setClass("b", representation=list(x1="character"),
contains="a") Error in .local(.Object, ...) : element 1 is empty; ???the part of the args list of 'length' being evaluated was: ???(x)
Can anyone please point me where I am doing wrong? Thanks, ? ? ?