modifying argument of a .C call (DUP=FALSE)
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