Skip to content

using <<- with a changing variable name (substitute?)

3 messages · Tamas K Papp, Brian Ripley

#
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
#
On Mon, 8 Aug 2005, Tamas K Papp wrote:

            
Why use sapply?

r[] <- ifelse(r >= d, r-d, ifelse(r >= 0, 0, r))

is one more efficient way.
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.

  
    
#
On Mon, Aug 08, 2005 at 04:07:10PM +0100, Prof Brian Ripley wrote:
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