Steve Lianoglou
2009-Oct-14 18:31 UTC
[R] Cacheing computationally expensive getter methods for S4 objects
Hi, I was wondering if there was a way to store the results of a computationally expensive "getter" call on an S4 object, so that it is only calculated once for each object. Trivial example: let's say I want to cache the "expensive" area calculation of a square object. setClass("Square", representation( length='numeric', width='numeric', area='numeric' ), prototype( length=0, width=0, area=-1 ) ) setGeneric("area", function(x) standardGeneric("area")) setMethod("area", "Square", function(x) { if (x at area == -1) { x at area <- x at width * x at height } x at area }) Now the first time I call ``area(my.square)`` it computes ``my.square at width * my.square at height``, but each subsequent call returns ``x at area`` since the area computation has already been calc'd and set for this object. Is this possible? I'm guessing the R pass by value semantics is going to make this one difficult ... is there some S4 reference I missed that has this type of info from? Thanks, -steve -- Steve Lianoglou Graduate Student: Computational Systems Biology | Memorial Sloan-Kettering Cancer Center | Weill Medical College of Cornell University Contact Info: http://cbio.mskcc.org/~lianos/contact
Benilton Carvalho
2009-Oct-14 18:57 UTC
[R] Cacheing computationally expensive getter methods for S4 objects
If you change 'area' to an environment, you may be able to get something close to what you want. For example: setClass("Square", representation( length='numeric', width='numeric', area='environment' ), prototype( length=0, width=0, area=new.env() ) ) setGeneric("area", function(x) standardGeneric("area")) setMethod("area", "Square", function(x){ if (length(ls(x at area)) == 0){ message("Computing") assign("area", x at width * x at length, envir=x at area) } message("Accessing") get("area", envir=x at area) }) tmp <- new("Square", length=5, width=10) area(tmp) ## This should show "computing" and "accessing" area(tmp) ## the 2nd call should show 'accessing' only b On Oct 14, 2009, at 3:31 PM, Steve Lianoglou wrote:> Hi, > > I was wondering if there was a way to store the results of a > computationally expensive "getter" call on an S4 object, so that it is > only calculated once for each object. > > Trivial example: let's say I want to cache the "expensive" area > calculation of a square object. > > setClass("Square", > representation( > length='numeric', > width='numeric', > area='numeric' > ), > prototype( > length=0, > width=0, > area=-1 > ) > ) > > setGeneric("area", function(x) standardGeneric("area")) > setMethod("area", "Square", > function(x) { > if (x at area == -1) { > x at area <- x at width * x at height > } > x at area > }) > > Now the first time I call ``area(my.square)`` it computes > ``my.square at width * my.square at height``, but each subsequent call > returns ``x at area`` since the area computation has already been calc'd > and set for this object. > > Is this possible? I'm guessing the R pass by value semantics is going > to make this one difficult ... is there some S4 reference I missed > that has this type of info from? > > Thanks, > -steve > > -- > Steve Lianoglou > Graduate Student: Computational Systems Biology > | Memorial Sloan-Kettering Cancer Center > | Weill Medical College of Cornell University > Contact Info: http://cbio.mskcc.org/~lianos/contact > > ______________________________________________ > 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.