From murdoch at stats.uwo.ca  Sun Apr  4 01:42:21 2010
From: murdoch at stats.uwo.ca (Duncan Murdoch)
Date: Sat, 03 Apr 2010 19:42:21 -0400
Subject: [Rd] full copy on assignment?
In-Reply-To: <20100403223435.GA27306@laura>
References: <20100403223435.GA27306@laura>
Message-ID: <4BB7D25D.1040105@stats.uwo.ca>

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



[Rd] full copy on assignment?
Duncan Murdoch