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