清單

列表可以是 [ 的子集:

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'