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.
>