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

Peter Dalgaard p.dalgaard at biostat.ku.dk
Mon Aug 8 21:28:44 CEST 2005


Tamas K Papp <tpapp at princeton.edu> writes:

> 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?

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.

-- 
   O__  ---- Peter Dalgaard             Øster Farimagsgade 5, Entr.B
  c/ /'_ --- Dept. of Biostatistics     PO Box 2099, 1014 Cph. K
 (*) \(*) -- University of Copenhagen   Denmark          Ph:  (+45) 35327918
~~~~~~~~~~ - (p.dalgaard at biostat.ku.dk)                  FAX: (+45) 35327907




More information about the R-help mailing list