清单

列表可以是 [ 的子集:

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"

注意 l1[2] 的结果仍然是一个列表,因为 [ 运算符选择列表的元素,返回一个较小的列表。[[ 运算符提取列表元素,返回列表元素类型的对象。

元素可以通过数字或名称的字符串(如果存在)进行索引。通过传递数字或名称字符串的向量,可以使用 [ 选择多个元素。索引与 length > 1[[[ 矢量返回一个清单与指定的元素和一个递归子集(如果可用),分别

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

相比:

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

这相当于:

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

$ 运算符允许你仅按名称选择列表元素,但与 [[[ 不同,不需要引号。作为中缀运算符,$ 只能使用一个名称:

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

此外,$ 运算符默认允许部分匹配:

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

[[ 相比,需要指定是否允许部分匹配:

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

设置 options(warnPartialMatchDollar = TRUE),当与 $ 发生部分匹配时给出警告

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