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

Prof Brian Ripley ripley at stats.ox.ac.uk
Mon Aug 8 21:41:26 CEST 2005


On Mon, 8 Aug 2005, Peter Dalgaard wrote:

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

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'.

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




More information about the R-help mailing list