On Tue, 13 Aug 2002, Laurent Gautier wrote:
Dear all, I have a question about the way the replacement of elements in an array works in R (having a slight idea of the answer), and a question about the way to achieve my goals. If I have a 3 ways-array called 'a', the command a[1, , ] <- rnorm(10) # assumes the size matches will result in having the whole object 'a' copied (since arrays are just 'vectors with dimensions' in R) ... and at some point two objects like 'a' will be in memory, right ? (this was the first question).
I don't think so. See do_subassign and descendants. It contains
/* If there are multiple references to an object we must */
/* duplicate it so that only the local version is mutated. */
/* This will duplicate more often than necessary, but saves */
/* over always duplicating. */
/* FIXME: shouldn't x be protected? */
if (NAMED(CAR(args)) == 2)
x = SETCAR(args, duplicate(CAR(args)));
Now coercion can force a copy, but starting from a numeric array I think
your example does not duplicate. And I can prove it:
A <- array(0, dim=c(500, 500, 10)) object.size(A)
[1] 20000128
memory.size(T)
[1] 29028352
A[1,,] <- 1 memory.size(T)
[1] 29028352 so there was never a second copy.
I have rather large arrays, and I would like to modify some of their elements in-situ (to save memory). Is there a way to do that ?
See above. Do your own experiments / reading of code?
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 272860 (secr) Oxford OX1 3TG, UK Fax: +44 1865 272595 -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html Send "info", "help", or "[un]subscribe" (in the "body", not the subject !) To: r-help-request at stat.math.ethz.ch _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._