[R] Setting Derived Class Slots

Martin Morgan mtmorgan at fhcrc.org
Tue Jul 16 18:40:27 CEST 2013


On 07/16/2013 06:36 AM, Steve Creamer wrote:
> Dear All....I am really struggling with oo in R. Trying to set attributes of
> the base class in a derived class method but the slot is only populated in
> the method itself, not when I try to print out the object from the console.
>
> Code is
>
> library(RODBC)
> #
> # -----------------------------------------------------
> # Define a medical event class. This is abstract (VIRTUAL)
> # -----------------------------------------------------
> #
> setClass("Medical_Event",
>           representation(
>              Event_Name="character",
>              Capacity_Profile="numeric",
>              Delay_Profile="numeric",
>              "VIRTUAL"),
>           prototype(Event_Name="An
> Event",Capacity_Profile=c(.2,.2,.2,.2,.2,0,0)))
>
> setGeneric("getDelayProfile",function(object){standardGeneric("getDelayProfile")},simpleInheritanceOnly=T)
>
> # ------------------------------------------
> # Now define a derived class called GP_Event
> # ------------------------------------------
>
> setClass("GP_Event",representation(Surgery_Name="character"),contains=c("Medical_Event"),prototype(Surgery_Name="Unknown"))
>
> # -----------------------------------------
> # Now define a derived class called OP_Appt
> # -----------------------------------------
>
> setClass("OP_Appt",representation(Clinic_Name="character"),contains=c("Medical_Event"),prototype(Clinic_Name="Unknown"))
>
>
> setMethod(f="getDelayProfile",signature("OP_Appt"),definition=function(object)
>     {
>        OpTablesDB<-odbcDriverConnect("DRIVER=Microsoft Access Driver (*.mdb,
> *.accdb);
>                                       DBQ=Z:\\srp\\Development
> Code\\Projects\\CancerPathwaySimulation\\Database\\CancerPathway.accdb")
>        strQuery<-"select * from op_profile"
>        odbcQuery(OpTablesDB,strQuery)
>        dfQuery<-odbcFetchRows(OpTablesDB)
>        odbcClose(OpTablesDB)
>        delay<-dfQuery$data[[1]][1:70]
>        prob<-dfQuery$data[[2]][1:70]
> #      as(object,"Medical_Event")@Delay_Profile<-prob
>        object at Delay_Profile <- prob
>         object
>     }
> )
>
> if I instantiate a new instance of the derived class
>
> *aTest<-new("OPP_Appt")*and then try and populate the attribute
> Delay_Profile by
>
> *getDelayProfile(aTest) *
>
> the object slot seems to be populated in the method because I can print it
> out, viz
>
> An object of class "OP_Appt"
> Slot "Clinic_Name":
> [1] "Unknown"
>
> Slot "Event_Name":
> [1] "An Event"
>
> Slot "Capacity_Profile":
> [1] 0.2 0.2 0.2 0.2 0.2 0.0 0.0
>
> *Slot "Delay_Profile":
>   [1]  14  21  25  29  27  49  72  71  43  65 102 134 223 358  24  14  21  25
> 35  31  38  43  31  23  21  26  46  54  42  26
> [31]  34  24  25  41  48  33  30  17  18  31  24  35  35  24  16  32  36  39
> 46  36  26  16  27  21  30  32  33  27   7   5
> [61]   9  10   9  11   8   6   1  11  14  10*
>
> but when the method returns and I type
>
> *aTest*
>
> I get
>
> An object of class "OP_Appt"
> Slot "Clinic_Name":
> [1] "Unknown"
>
> Slot "Event_Name":
> [1] "An Event"
>
> Slot "Capacity_Profile":
> [1] 0.2 0.2 0.2 0.2 0.2 0.0 0.0
>
> *Slot "Delay_Profile":
> numeric(0)*
>
> ie the Delay_Profile slot is empty????
>
> What haven't I done - can anybody help me please?

It helps to provide a more minimal example, preferably reproducible (no data 
base queries needed to illustrate your problem); I'm guessing that, just as with

f = funtion(l) { l$a = 1; l }
lst = list(a=0, b=1)

one would 'update' lst with

   lst = f(lst)

and not

   f(lst)

you need to assign the return value to the original object

   aTest <- getDelayProfile(aTest)

Martin

> Many Thanks
>
> Steve Creamer
>
>
>
>
> --
> View this message in context: http://r.789695.n4.nabble.com/Setting-Derived-Class-Slots-tp4671683.html
> Sent from the R help mailing list archive at Nabble.com.
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>


-- 
Computational Biology / Fred Hutchinson Cancer Research Center
1100 Fairview Ave. N.
PO Box 19024 Seattle, WA 98109

Location: Arnold Building M1 B861
Phone: (206) 667-2793



More information about the R-help mailing list