[Rd] caching frequently used values

Robert Gentleman rgentlem at fhcrc.org
Thu Dec 14 00:05:46 CET 2006


e1 = new.env(hash=TRUE)

e1[["1"]] = whateveryouwant

ie. just transform to characters, but I don't see why you want to do 
that - surely there are more informative names to be used -



Tamas K Papp wrote:
> Hi Robert,
> 
> Thanks for your answer.  I would create and environment with
> new.env(), but how can I assign and retrieve values based on a
> numerical index (the derivative)?  The example of the help page of
> assign explicitly shows that assign("a[1]") does not work for this
> purpose.
> 
> Thanks,
> 
> Tamas
> 
> On Wed, Dec 13, 2006 at 01:54:28PM -0800, Robert Gentleman wrote:
> 
>> the idea you are considering is also, at times, referred to as 
>> memoizing. I would not use a list, but rather an environment, and 
>> basically you implement something that first looks to see if there is a 
>> value, and if not, compute and store. It can speed things up a lot in 
>> some examples (and slow them down a lot in others).
>>
>> Wikipedia amongst other sources:
>>  http://en.wikipedia.org/wiki/Memoization
>>
>> Environments have advantages over lists here (if there are lots of 
>> matrices the lookup can be faster - make sure you use hash=TRUE), and 
>> reference semantics, which you probably want.
>>
>> Tamas K Papp wrote:
>>> Hi,
>>>
>>> I am trying to find an elegant way to compute and store some
>>> frequently used matrices "on demand".  The Matrix package already uses
>>> something like this for storing decompositions, but I don't know how
>>> to do it.
>>>
>>> The actual context is the following:
>>>
>>> A list has information about a basis of a B-spline space (nodes,
>>> order) and gridpoints at which the basis functions would be evaluated
>>> (not necessarily the nodes).  Something like this:
>>>
>>> bsplinegrid <- list(nodes=1:8,order=4,grid=seq(2,5,by=.2))
>>>
>>> I need the design matrix (computed by splineDesign) for various
>>> derivatives (not necessarily known in advance), to be calculated by
>>> the function
>>>
>>> bsplinematrix <- function(bsplinegrid, deriv=0) {
>>>  x <- bsplinegrid$grid
>>>  Matrix(splineDesign(bslinegrid$knots, x, ord=basis$order,
>>>                      derivs = rep(deriv,length(x))))
>>> }
>>>
>>> However, I don't want to call splineDesign all the time.  A smart way
>>> would be storing the calculated matrices in a list inside bsplinegrid.
>>> Pseudocode would look like this:
>>>
>>> bsplinematrix <- function(bsplinegrid, deriv=0) {
>>>  if (is.null(bsplinegrid$matrices[[deriv+1]])) {
>>>    ## compute the matrix and put it in the list bsplinegrid$matrices,
>>>    ## but not of the local copy
>>>  }
>>>  bsplinegrid$matrices[[deriv+1]]
>>> }
>>>
>>> My problem is that I don't know how to modify bsplinegrid$matrices
>>> outside the function -- assignment inside would only modify the local
>>> copy.
>>>
>>> Any help would be appreciated -- I wanted to learn how Matrix does it,
>>> but don't know how to display the source with s3 methods (getAnywhere
>>> doesn't work).
>>>
>>> Tamas
>>>
>>> ______________________________________________
>>> R-devel at r-project.org mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>>
>> -- 
>> Robert Gentleman, PhD
>> Program in Computational Biology
>> Division of Public Health Sciences
>> Fred Hutchinson Cancer Research Center
>> 1100 Fairview Ave. N, M2-B876
>> PO Box 19024
>> Seattle, Washington 98109-1024
>> 206-667-7700
>> rgentlem at fhcrc.org
> 

-- 
Robert Gentleman, PhD
Program in Computational Biology
Division of Public Health Sciences
Fred Hutchinson Cancer Research Center
1100 Fairview Ave. N, M2-B876
PO Box 19024
Seattle, Washington 98109-1024
206-667-7700
rgentlem at fhcrc.org



More information about the R-devel mailing list