# R Language Subsetting Lists

## Example

A list can be subset with `[`:

``````l1 <- list(c(1, 2, 3), 'two' = c("a", "b", "c"), list(10, 20))
l1
## [[1]]
## [1] 1 2 3
##
## \$two
## [1] "a" "b" "c"
##
## [[3]]
## [[3]][[1]]
## [1] 10
##
## [[3]][[2]]
## [1] 20

l1[1]
## [[1]]
## [1] 1 2 3

l1['two']
## \$two
## [1] "a" "b" "c"

l1[[2]]
## [1] "a" "b" "c"

l1[['two']]
## [1] "a" "b" "c"
``````

Note the result of `l1[2]` is still a list, as the `[` operator selects elements of a list, returning a smaller list. The `[[` operator extracts list elements, returning an object of the type of the list element.

Elements can be indexed by number or a character string of the name (if it exists). Multiple elements can be selected with `[` by passing a vector of numbers or strings of names. Indexing with a vector of `length > 1` in `[` and `[[` returns a "list" with the specified elements and a recursive subset (if available), respectively:

``````l1[c(3, 1)]
## [[1]]
## [[1]][[1]]
## [1] 10
##
## [[1]][[2]]
## [1] 20
##
##
## [[2]]
## [1] 1 2 3
``````

Compared to:

``````l1[[c(3, 1)]]
## [1] 10
``````

which is equivalent to:

``````l1[[3]][[1]]
## [1] 10
``````

The `\$` operator allows you to select list elements solely by name, but unlike `[` and `[[`, does not require quotes. As an infix operator, `\$` can only take a single name:

``````l1\$two
## [1] "a" "b" "c"
``````

Also, the `\$` operator allows for partial matching by default:

``````l1\$t
## [1] "a" "b" "c"
``````

in contrast with `[[` where it needs to be specified whether partial matching is allowed:

``````l1[["t"]]
## NULL
l1[["t", exact = FALSE]]
## [1] "a" "b" "c"
``````

Setting `options(warnPartialMatchDollar = TRUE)`, a "warning" is given when partial matching happens with `\$`:

``````l1\$t
## [1] "a" "b" "c"
## Warning message:
## In l1\$t : partial match of 't' to 'two'
``````