Although the R vector is a list of items, it suffers from the constraint that all elements in a vector must be the same data type. The *list* data type is a one dimensional list of items, where each item can be a different data type. Items in a list can be anything, including vectors, matrices and even other lists. A list can be created using the `list()`

function:

> x = list(42, T, "wibble", matrix(1:10,5,2)) > x [[1]] [1] 42 [[2]] [1] TRUE [[3]] [1] "wibble" [[4]] [,1] [,2] [1,] 1 6 [2,] 2 7 [3,] 3 8 [4,] 4 9 [5,] 5 10

The list `x`

contains integer, logical, character and matrix data types. To refer to an element in the list, we need to use the double-bracket notation, so `x[[1]]`

is the first element in the list, which is a vector with a single element (42). The element `x[[4]]`

is the 5×2 matrix shown.

Note the difference between the following two objects:

> intList = list(1:10) > intVector = 1:10 > intList [[1]] [1] 1 2 3 4 5 6 7 8 9 10 > intVector [1] 1 2 3 4 5 6 7 8 9 10

The object `intList`

is a list containing a single element which is the vector of integers from 1 to 10. The object `intVector`

is a vector with 10 elements. To get the number 4 out of `intList`

, we’d need to say `intList[[1]][4]`

while for `intVector`

we say `intVector[4]`

.

The `typeof()`

function returns ‘list’ when applied to a list, no matter what that list contains. As ‘list’ isn’t a numeric type, we can’t use any of the mathematical operations on a list.

We can name the elements of a list by using the `names()`

function. For our list `x`

above we could say:

> names(x) = c("number", "logical", "string", "matrix") > x $number [1] 42 $logical [1] TRUE $string [1] "wibble" $matrix [,1] [,2] [1,] 1 6 [2,] 2 7 [3,] 3 8 [4,] 4 9 [5,] 5 10

Notice that the name of each element is prefixed by a $. We can use the $ notation to refer to list elements:

> x$matrix [,1] [,2] [1,] 1 6 [2,] 2 7 [3,] 3 8 [4,] 4 9 [5,] 5 10

We can also use the notation `x[["matrix"]]`

to get the same element. (Vector elements can also be named, but we can’t use the $ notation to refer to vector elements; we must use `vec["name"]`

.)

Apart from that, there’s not a lot that can be done with lists at the top level. Their main use is as a storage container for other objects, and as the basis for the *data frame*, which is a much more commonly used data type.