Tamas K Papp
2005-Aug-08 14:26 UTC
[R] using <<- with a changing variable name (substitute?)
I have a matrix r and a scalar d, and I would like to apply the following functions to each of its elements: 1. if r < 0, no change 2. if 0 <= r < d, replace element by zero 3. if d <= r, replace element by r-d I wrote a small function for this m <- function(b) {sapply(b, function(bb) { if (bb < 0) {bb} else {if (bb>d) {bb-d} else 0} })} so I can simply say r <- m(r). The problem is that the matrix r is huge and only one of them fits in the memory, and I don't need the original r, so I would like to do this memory-efficiently. Moreover, there are matrices with various names (not only r) so I need a generic function (they don't fit in memory at the same time, I load, save and rm them). I tried various combinations of <<-, assign, substitute etc. but could not get it working. Could somebody please help me? Tamas
Prof Brian Ripley
2005-Aug-08 15:07 UTC
[R] using <<- with a changing variable name (substitute?)
On Mon, 8 Aug 2005, Tamas K Papp wrote:> I have a matrix r and a scalar d, and I would like to apply the > following functions to each of its elements: > > 1. if r < 0, no change > 2. if 0 <= r < d, replace element by zero > 3. if d <= r, replace element by r-d > > I wrote a small function for this > > m <- function(b) {sapply(b, function(bb) { > if (bb < 0) {bb} else {if (bb>d) {bb-d} else 0} > })}Why use sapply? r[] <- ifelse(r >= d, r-d, ifelse(r >= 0, 0, r)) is one more efficient way.> > so I can simply say r <- m(r). The problem is that the matrix r is > huge and only one of them fits in the memory,If that is literally true, you cannot do this at R level AFAICS. The only way I can see that you can do this with standard semantics is m(r) <- d with a replacement function m<-() written using .Call. Using "m<-" <- function(r, d) ifelse(r >= d, r-d, ifelse(r >= 0, 0, r)) is going to make several copies.> and I don't need the > original r, so I would like to do this memory-efficiently. Moreover, > there are matrices with various names (not only r) so I need a generic > function (they don't fit in memory at the same time, I load, save and > rm them). > > I tried various combinations of <<-, assign, substitute etc. but could > not get it working. Could somebody please help me?-- Brian D. Ripley, ripley at stats.ox.ac.uk Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272866 (PA) Oxford OX1 3TG, UK Fax: +44 1865 272595
Tamas K Papp
2005-Aug-08 15:22 UTC
[R] using <<- with a changing variable name (substitute?)
On Mon, Aug 08, 2005 at 04:07:10PM +0100, Prof Brian Ripley wrote:> On Mon, 8 Aug 2005, Tamas K Papp wrote: > > > m <- function(b) {sapply(b, function(bb) { > > if (bb < 0) {bb} else {if (bb>d) {bb-d} else 0} > > })} > > Why use sapply? > > r[] <- ifelse(r >= d, r-d, ifelse(r >= 0, 0, r)) > > is one more efficient way.Thank you very much, this speeded up things considerably. I need this operation to ignore the first column of the matrix, is there a more efficient way than r[,-1] <- ifelse(r[,-1] >= d, r[,-1]-d, ifelse(r[,-1] >= 0, 0, r[,-1])) ? Tamas