向量的元素要求都是同类型的,而列表(list)与向量不同,可以组合多个不同类型的对象。列表在R中扮演着一个至关重要的角色,是数据框和面向对象编程的基础。
列表是R的数据类型中最为复杂的一种。一般来说,列表就是一些对象(或成分,component)的有序集合。列表能整合若干(可能无关的)对象到单个对象名下。例如,某个列表中可能是若干向量、矩阵、数据框,甚至是其他列表的组合。
从技术上讲,列表就是向量。之前我们接触过的普通向量都称为“原子型(atomic)”向量,就是说,向量的元素已经是 最小的、不可再分的。而列表则属于“递归型(recursive)”向量。
可以使用函数list()创建列表:
mylist <- list( name1=object1, name2=object2, … )
其中的对象可以是R语言中的任何数据结构。
list( name="Joe", salary=55000, union=T )
$name
[1] "Joe"
$salary
[1] 55000
$union
[1] TRUE
R语言中列表各组件的名称叫做标签(tags),例如上面代码中的salary。实际上标签是可选的,也可以不指定。上面代码也可以这样写:
> list( "Joe", 55000, T )
[[1]]
[1] "Joe"
[[2]]
[1] 55000
[[3]]
[1] TRUE
但是一般来说推荐为各个部分取名而不用这些默认的数值,这样使代码更清晰而且不容易犯错误。
在使用的时候,标签的名字可以简写,只写出前几个字母,只要不引起歧义,R都能识别:
> l <- list( name="Joe", salary=55000, union=T )
> l$salary
[1] 55000
> l$sal
[1] 55000
因为列表是向量,因此可以使用vector来创建列表。
> z <- vector( mode = "list" )
> z[["abc"]] <- 3 #两个中括号间不允许有空格
> z
$abc[1] 3
测试列表的长度:
> l <- list( name="Joe", salary=55000, union=T )
> length( l )
[1] 3
►列表连接
当连接函数c()的参数中有列表对象时,结果就是一个列表模式的对象,它的分量是那些当作参数的列表。
> list.ABC <- c( list.A, list.B, list.C )
由于两个原因,列表成了R中的重要的数据结构。首先,列表允许以一种简单的方式组织和重新调用不相干的信息;其次,许多R函数的运行结果都是以列表的形式返回的。
注意:
Ю 对象名称中的句点(.)没有特殊意义。但美元符号($)却有着和其他语言中的句点类似的含义,即指定一个对象中的某部分。
Ю R不提供多行注释或块注释功能。必须以#作为多行注释每行的开始。出于调试的目的,可以把想让编译器忽略的代码放到语句if(FALSE){…}中。
Ю 将一个值赋给某个向量、矩阵、数组或列表中一个不存在的元素时,R将自动扩展这个数据结构以容纳新值。
Ю R中没有标量。标量以单元素向量的形式出现。
Ю R中的下标不从0开始,而从1开始。
Ю 变量无法被声明,它们在首次被赋值时生成。