[R] R.oo: do work on data member at construction

Henrik Bengtsson hb at biostat.ucsf.edu
Thu Sep 22 18:18:15 CEST 2011


On Thu, Sep 22, 2011 at 9:06 AM, Ben qant <ccquant at gmail.com> wrote:
> Hello,
>
> I'd like to 'do work' on data members upon construction (i.e. without
> implementing it in a get method). Is this the best way to create data member
> 'z' upon construction? I'm thinking if .z=paste(x,y) below gets more complex
> I'll run into issues.
>
> setConstructorS3("MyClass", function(x=NA,y=NA,...) {
>  this <- extend(Object(), "MyClass",
>    .x=x,
>    .y=y,
>    .z=paste(x,y)
>  )

Looks good to me and is standard R procedure where you work with the
*arguments*.  You can also work on the object after it's been
instantiated, e.g.

 setConstructorS3("MyClass", function(x=NA,y=NA,...) {
  this <- extend(Object(), "MyClass",
   .x=x,
   .y=y,
   .z=NULL
  )

  # Assign z
  this$.z <- paste(this$.x, this$.y);

  this;
})

Note that if .z always a function of .x and .y it is redundant.  Then
an alternative is to create it on the fly, i.e.

setMethodS3("getZ", "MyClass", function(this, ...) {
  x <- this$.x;
  y <- this$.;
  z <- paste(x, y);
  z;
})

You can then make it clever and cache the results so that it is only
calculated once, e.g.

setMethodS3("getZ", "MyClass", function(this, ...) {
  z <- this$.z;
  if (is.null(z)) {
    x <- this$.x;
    y <- this$.;
    z <- paste(x, y);
    this$.z <- z;
  }
  z;
})

However, you then have to make sure to reset z (this$.z <- NULL)
whenever .x or .y is changed.

/Henrik

>
> })
> setMethodS3("getX", "MyClass", function(this, ...) {
>  this$.x;
> })
> setMethodS3("getY", "MyClass", function(this, ...) {
>  this$.y;
> })
> setMethodS3("getZ", "MyClass", function(this, ...) {
>  this$.z;
> })
>
>> mc = MyClass('a','b')
>> mc$x
> [1] "a"
>> mc$y
> [1] "b"
>> mc$z
> [1] "a b"
>
>
> Thanks,
>
> ben
>
>        [[alternative HTML version deleted]]
>
> ______________________________________________
> 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.
>



More information about the R-help mailing list