On 03/04/2010 6:34 PM, Norm Matloff wrote:
Here's a basic question that doesn't seem to be completely answered in
the docs, and which unfortunately I've not had time to figure out by
wading through the R source code:
In a vector (or array) element assignment such as
z[3] <- 8
is there in actuality a full rewriting of the entire vector pointed to
by z, as implied by
z <- "[<-"(z,3,value=8)
Assume that an element of z has already being changed previously, so
that copy-on-change issues don't apply, with z being reassigned back to
the same memory address.
I seem to recall reading somewhere that recent R versions make some
attempt to avoid rewriting the entire vector, and my timing experiments
seem to suggest that it's true.
So, is a full rewrite avoided? And where in the source code is this
done?
It depends. User-written assignment functions can't avoid the copy.
They act like the expansion
z <- "[<-"(z,3,value=8)
and in that, R can't tell that the newly created result of
"[<-"(z,3,value=8) will later overwrite z.
However, if z is a regular vector without a class and you're using the
built-in version of z[3] <- 8, it can take some shortcuts. This happens
in multiple places; one is around line 488 of subassign.c another is
around line 1336. In each of these places copies are made in some
circumstances, but not in general.
Duncan Murdoch
______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel