清单
列表可以是 [
的子集:
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'