6.1 列表
R 的列表(list)是一个以对象的有序集合构成的对象。列表中包含的对象又称为它的分量(components)。
分量可以是不同的模式或类型,如一个列表可以同时包括数值向量,逻辑向量,矩阵,复向量,字符数组,函数等等。下面的例子演示怎么创建一个列表:
> Lst <- list(name="Fred", wife="Mary", no.children=3, child.ages=c(4,7,9))
分量常常会被编号(numbered),并且可以利用这种编号来访问分量。如果 列表 Lst
有四个分量,这些分量则可以用 Lst[[1]]
, Lst[[2]]
, Lst[[3]]
和 Lst[[4]]
独立访问。如果 Lst[[4]]
是一个有下标的数组,那么 Lst[[4]][1]
就是该数组的第 一个元素。
因为 Lst
是一个列表,所以函数 length(Lst)
给出的仅仅是分量的数目(最高层次的)。
列表的分量可以被命名,这种情况下可以通过名字访问。此时,可以把字符串形式的分量名字放在列表名后面的双中括号中,或者干脆采用下面的形式
> name$component name
达到一样的目的。 这种方法非常有用。使你在忘记分量编号的时候,也可以很容易找到想要的东西。
因此在上面给定的例子中:
Lst$name
和 Lst[[1]]
返回结果都是 "Fred
",
Lst$wife
和 Lst[[2]]
返回的则是"Mary
",
而 Lst$child.ages[1]
和 Lst[[4]][1]
返回一样的数字4。
另外你同样可以在双中括号中使用列表分量的名字,即和 Lst$name
等价的 Lst[["name"]]
。当分量的名字保存在另外一个变量中时,这种方法特别的有用。就如下面的例子所示
> x <- "name"; Lst[[x]]
这里特别要注意一下 Lst[[1]]
和 Lst[1]
的差别。[[...]]
是用来选择单个元素的操作符,而 [...]
是一个更为一般的下标操作符。因此前者得到的是列表 Lst
中的第一个对象,并且含有分量名字的命名列表(named list)中的分量名字会被排除在外的1。后者得到的则是列表 Lst
中仅仅由第一个元素构成的子列表。如果是命名列表, 分量名字会传给子列表的。
分量名字可以简写2,原则是只要能很好的区分所有分量就行。因此 Lst$coefficients
可以简写为 Lst$coe
而 Lst$covar
成 Lst$cov
。
名字向量(记录分量名字的向量)可以简单地看作是列表的一个属性,能像其他属性一样操作。除了列表,其他的结构对象也可能会给出一个类似的名字(names)属性。