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

From: Prof Brian Ripley <>
Date: Tue 09 Aug 2005 - 05:41:26 EST

On Mon, 8 Aug 2005, Peter Dalgaard wrote:

> Tamas K Papp <> 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,        
Professor of Applied Statistics,
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595

______________________________________________ mailing list
PLEASE do read the posting guide!
Received on Tue Aug 09 05:47:41 2005

This archive was generated by hypermail 2.1.8 : Sun 23 Oct 2005 - 15:10:07 EST