Matthias Burger
2003-Jun-24 17:19 UTC
[Rd] S4 method setClass prototype definition question
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")
> 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
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