On Mon, 8 Aug 2005, Peter Dalgaard wrote: > Tamas K Papp <[EMAIL PROTECTED]> 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, [EMAIL PROTECTED] 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 ______________________________________________ R-help@stat.math.ethz.ch mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html