[R] There is a relationship of the Modify-in-place optimisation of a object and the local variable `*tmp*`?

Duncan Murdoch murdoch@dunc@n @end|ng |rom gm@||@com
Fri Oct 8 11:58:35 CEST 2021


On 07/10/2021 6:46 p.m., Ben Deivide de Oliveira Batista wrote:
> Dear R users,
> 
> When modify-in-place of objects occurs, is there a local variable called
> `*tmp*`, behind the scenes R? Let's look at two examples to understand the
> question.
> 
> Example 1 (R Language Definition)
> --------------------------------------------------
> 
>> x <- 1:10
>> tracemem(x)
> [1] "<000000000798F758>"
>> x[3:5] <- 13:15
> tracemem[0x000000000798f758 -> 0x0000000008207030]:
> 
> The result of this command is as if the following had been executed
> `*tmp*` <- x
> x <- "[<-"(`*tmp*`, 3:5, value=13:15)
> rm(`*tmp*`)
> 
> Conclusion: Here copy-on-modify occurs!
> 
> 
> Example 2 : Modify-in-place
> -----------------------
> 
>> x <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
>> tracemem(x)
> [1] "<0000000008BFB818>"
>> x[3:5] <- 13:15Conclusion: Here modify-in-place occurs!
> For example 2, is there a local variable `*tmp*` for this case? If so,
> what would the syntactic representation look like, similar to example 1?

I think there is, and it would be the same as in 1.  The memory 
operations are different because x is different:  in 1, it is stored in 
a compact representation of 1:10, which needs to be expanded to a full 
array of doubles before the entries can be changed.  In 2, it is already 
stored as an array of doubles so this isn't needed.

Duncan Murdoch



More information about the R-help mailing list