Re: [Rd] caching frequently used values

From: Robert Gentleman <rgentlem_at_fhcrc.org>
Date: Wed 13 Dec 2006 - 23:05:46 GMT

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@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@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@fhcrc.org

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
Received on Thu Dec 14 15:25:43 2006

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.1.8, at Thu 14 Dec 2006 - 04:30:59 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-devel. Please read the posting guide before posting to the list.