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 i
th 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 13
The 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 ...
Get R in a Nutshell, 2nd Edition now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.