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

______________________________________________
[EMAIL PROTECTED] mailing list
https://www.stat.math.ethz.ch/mailman/listinfo/r-devel

Reply via email to