Understanding the copy-on-modify mechanism
In the previous section, we showed how lazy evaluation works and how it may help save computing time and working memory by avoiding unnecessary evaluation of function arguments. In this section, I will show you an important feature of R that makes it safer to work with data. Suppose we create a simple numeric vector x1
:
x1 <- c(1, 2, 3)
Then, we assign the value of x1
to x2
:
x2 <- x1
Now, x1
and x2
have exactly the same value. What if we modify an element in one of the two vectors? Will both vectors change?
x1[1] <- 0 x1 ## [1] 0 2 3 x2 ## [1] 1 2 3
The output shows that when x1
is changed, x2
will remain unchanged. You may guess that the assignment automatically copies the value and makes the new variable point to the copy of the data instead of the original data. Let's use tracemem()
to track the footprint of the data in memory.
Let's reset the vectors and conduct an experiment by tracing the memory addresses...