From tpapp at Princeton.EDU  Wed Dec 13 22:17:29 2006
From: tpapp at Princeton.EDU (Tamas K Papp)
Date: Wed, 13 Dec 2006 16:17:29 -0500
Subject: [Rd] caching frequently used values
Message-ID: <20061213211729.GA9737@pu100877.student.princeton.edu>

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



[Rd] caching frequently used values
Tamas K Papp