Skip to content

modifying argument of a .C call (DUP=FALSE)

3 messages · Tamas K Papp, Peter Dalgaard, Brian Ripley

#
I have a huge matrix on which I need to do a simple (elementwise)
transformation.  Two of these matrices cannot fit in the memory, so I cannot
do this in R.

I thought of writing some C code to do this and calling it using .C with
DUP=FALSE.  All I need is a simple for loop that replaces elements with
their new value, something like

void transform(double *a, int *lengtha)  {
  int i;
  for (i=0; i < *lengtha; i++) {
    *(a+i) = calculatenewvaluesomehow(*(a+i))
  }
}

trans <- function(a) .C("transform",as.double(a), as.integer(length(a))

is it possible to do this?  The manuals say that it is dangerous, is it
possible to avoid the dangers somehow?

Tamas
#
Tamas K Papp <tpapp at princeton.edu> writes:
It's more a question of whether the dangers affect you. In general,
the issue is that you risk modifying a second (virtual) copy of the
data along with the one you intend to modify. If you're sure that you
don't have any, the point is moot. It is fairly difficult to be sure
of that in the general case, which is why we generally discourage
DUP=FALSE, especially for package writers, but for personal use you
might just get away with it.
#
On Mon, 8 Aug 2005, Peter Dalgaard wrote:

            
I did specifically suggest .Call in an earlier reply to the same person on 
the same problem, because there you can do this via a replacement function 
with standard semantics.  See the discussion of SET_NAMED in `Writing R 
Extensions'.