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 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.