I think you didn't type what you meant to type (see below.) Sourcing in your class descriptions with 1.7.1, I get what you expected.
new("Annotation1")
An object of class "Annotation1" Slot "x": NULL Slot "y": NULL Slot "catId": [1] -1 Slot "isResolved": [1] FALSE Slot "resolve": logical(0) Slot "valid": [1] TRUE
Matthias Burger wrote:
Dear list, this is not a problem report -- I would like to ask for advise what the recommended and safe way to perform the following is or what problems might arise in doing it differently. The question is: What is the recommended way of providing a default value in a prototype statement for a derived class for a slot provided from a parent class? I have first consulted the methods package reference but am still unclear to as this point. The following is a bit length example + variations thereof taken from a real project. I would appreciate any comments and insights shared. Best regards, Matthias ## ## R 1.7.1 on Debian Linux (compiled with gcc 3.2.2)
> version
_
platform i686-pc-linux-gnu
arch i686
os linux-gnu
system i686, linux-gnu
status
major 1
minor 7.1
year 2003
month 06
day 16
language R
## define a base class (virtual) without prototype
setClass("IDataType",
representation("VIRTUAL",
valid="logical"),
validity=NULL,
sealed=TRUE)
## same now with prototype definition
setClass("IDataType1",
representation("VIRTUAL",
valid="logical"),
prototype=list(valid=TRUE),
validity=NULL,
sealed=TRUE)
## and now the derived class in question
## the slot under investigatin is 'valid'
setClass("Annotation",
representation ("IDataType",
x="vector",
y="vector",
catId="integer",
isResolved="logical",
resolve="logical"),
prototype(isResolved=FALSE,
catId=as.integer(-1)),
validity=NULL,
sealed=TRUE)
## instantiate an object an
an<-new("Annotation")
> an
An object of class "Annotation"
Slot "x":
NULL
Slot "y":
NULL
Slot "catId":
[1] -1
Slot "isResolved":
[1] FALSE
Slot "resolve":
logical(0)
Slot "valid":
logical(0)
## which is what I expected. Now in order to set a default for
## the 'valid' slot (provided by the parent class 'IDataType') in the
## Annotation class I tried
setClass("Annotation1",
representation ("IDataType",
x="vector",
y="vector",
catId="integer",
isResolved="logical",
resolve="logical"),
prototype(isResolved=FALSE,
catId=as.integer(-1),
valid=TRUE),
validity=NULL,
sealed=TRUE)
## instantiate an object an1
> an1<-new("Annotation")
Sorry, naming it an1 still leaves it an object of class "Annotation", as the printed output tells you.
> an1
An object of class "Annotation"
Slot "x":
NULL
Slot "y":
NULL
Slot "catId":
[1] -1
Slot "isResolved":
[1] FALSE
Slot "resolve":
logical(0)
Slot "valid":
logical(0)
## now this is NOT what I had expected; my prediction would have been to see
## slot 'valid' set to TRUE
## ok, so this is an alternative to get what I aimed at, i.e. use the 2nd
## virtual base class IDataType1 with prototype definition
setClass("Annotation2",
representation ("IDataType1",
x="vector",
y="vector",
catId="integer",
isResolved="logical",
resolve="logical"),
prototype(isResolved=FALSE,
catId=as.integer(-1)),
validity=NULL,
sealed=TRUE)
[1] "Annotation2"
> an2<-new("Annotation2")
> an2
An object of class "Annotation2" Slot "x": NULL Slot "y": NULL Slot "catId": [1] -1 Slot "isResolved": [1] FALSE Slot "resolve": logical(0) Slot "valid": [1] TRUE ## so this does what I aimed at but surprises me as I thought it would ## not make sense ## to provide a prototype for a virtual class ## reading further in the methods package reference manual ## (refman.pdf: The Methods Package) ## I conclude that setAs ## use IDataType class w prototype and explicit contains statement
> setClass("Annotation3",
representation ("IDataType1",
x="vector",
y="vector",
catId="integer",
isResolved="logical",
resolve="logical"),
prototype(isResolved=FALSE,
catId=as.integer(-1)),
contains=as.character("IDataType1"),
validity=NULL,
sealed=TRUE)
[1] "Annotation3"
> an3<-new("Annotation3")
> an3
An object of class "Annotation3"
Slot "x":
NULL
Slot "y":
NULL
Slot "catId":
[1] -1
Slot "isResolved":
[1] FALSE
Slot "resolve":
logical(0)
Slot "valid":
[1] TRUE
## so this works aswell
## and yet another alternative:
## use IDataType class w/o prototype but explicitly use
## contain=as.character("IDataType")
## statement and set slot 'valid' prototype
> setClass("Annotation4",
representation ("IDataType",
x="vector",
y="vector",
catId="integer",
isResolved="logical",
resolve="logical"),
prototype(isResolved=FALSE,
catId=as.integer(-1),
valid=TRUE),
contains=as.character("IDataType"),
validity=NULL,
sealed=TRUE)
[1] "Annotation4"
> an4<-new("Annotation4")
> an4
An object of class "Annotation4" Slot "x": NULL Slot "y": NULL Slot "catId": [1] -1 Slot "isResolved": [1] FALSE Slot "resolve": logical(0) Slot "valid": [1] TRUE ## This also works as expected. ## So what is the recommended way of providing a default in a prototype ## statement for a ## slot provided from a parent class? -- Matthias Burger Bioinformatics R&D Epigenomics AG www.epigenomics.com Kleine Pr?sidentenstra?e 1 fax: +49-30-24345-555 10178 Berlin Germany phone: +49-30-24345-0
______________________________________________ R-devel@stat.math.ethz.ch mailing list https://www.stat.math.ethz.ch/mailman/listinfo/r-devel
John M. Chambers jmc@bell-labs.com Bell Labs, Lucent Technologies office: (908)582-2681 700 Mountain Avenue, Room 2C-282 fax: (908)582-3340 Murray Hill, NJ 07974 web: http://www.cs.bell-labs.com/~jmc