[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