Objects Are Copied in Assignment Statements
In assignment statements, most objects are immutable. Immutable objects are a good thing: for multithreaded programs, immutable objects help prevent errors. R will copy the object, not just the reference to the object. For example:
> u <- list(1) > v <- u > u[[1]] <- "hat" > u [[1]] [1] "hat" > v [[1]] [1] 1
This applies to vectors, lists, and most other primitive objects in R.
This is also true in function calls. Consider the following
function, which takes two arguments: a vector x and an index i. The function sets the ith element of x to 4 and does nothing else:
> f <- function(x,i) {x[i] = 4}Suppose that we define a vector w
and call f with x = w and i =
1:
> w <- c(10, 11, 12, 13) > f(w,1)
The vector w is copied when it is
passed to the function, so it is not modified by the function:
> w
[1] 10 11 12 13The value x is modified inside
the context of the function. Technically, the R interpreter copies the
object assigned to w and then assigns
the symbol x to point at the copy. We
will talk about how you can actually create mutable objects, or pass
references to objects, when we talk about environments.
Note
Although R will behave as if every assignment makes a new copy of an object, in many cases R will actually modify the object in place. For example, consider the following code fragment:
> v <- 1:100 > v[50] <- 27
R does not actually copy the vector when the 50th element is altered; instead, R modifies the vector in place. Semantically, this ...