From jmc at research.bell-labs.com  Wed Jul  2 15:46:15 2003
From: jmc at research.bell-labs.com (John Chambers)
Date: Wed Jul  2 20:46:34 2003
Subject: [Rd] S4 method setClass prototype definition question
References: <news2mail-3EF86BE1.4080508@epigenomics.com>
Message-ID: <3F032877.B051071E@research.bell-labs.com>

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


[Rd] S4 method setClass prototype definition question
John Chambers