在 R 中,用列表(list)来表达一组随意的对象,内部元素可以是不相同的任意类型,比如,可以是另一个列表。 列表结构十分灵活,应用广泛,类似于集合、字典等概念。

列表与向量(vector)相似,但不要求内部元素必须是同一类型的一种数据结构。

虽然列表中的元素也有顺序,但是在具体使用时一般会为每个元素命名,在访问时使用名字, 通过这种访问约定弱化了列表中元素的顺序。也就是说列表的应用一般不关心元素的顺序。 所以大多数情况下,列表不同于向量的第二个应用特征是内部元素的“无序”。

可以使用 list() 函数配合命名参数来生成一个列表:

> man <- list(name = 'Joe', gender = TRUE, age = 40, wife = 'Rose', children = 1)

一般通过 $ 加名字来访问列表的成员,当然还可以使用下标索引的方式来访问:

> man$name
[1] "Joe"
> man['name']
$name
[1] "Joe"

> man[['name']]
[1] "Joe"
> man[[1]]
[1] "Joe"
> man[1]
$name
[1] "Joe"

>

在使用下标索引方式来访问列表中的元素时,可以使用字符串的名字代替序号。 需要注意的是在用下标索引来访问列表中的元素时,存在两种下标操作,分别得到不同的对象。 当使用 […] 时得到的是一个新的子列表,而使用 [[…]] 时得到的是列表中的元素。

> class(man)
[1] "list"
> class(man[1])
[1] "list"
> class(man[[1]])
[1] "character"
>

可以进一步地从下面的例子中知道,[…] 就是取子列表的操作,而 [[…]] 则是取元素。

> man[1:3]
$name
[1] "Joe"

$gender
[1] TRUE

$age
[1] 40

> man[[1:3]]
Error in man[[1:3]] : recursive indexing failed at level 2
>

列表的元素的名字是非常重要的信息:

> names(man)
[1] "name"     "gender"   "age"      "wife"     "children"
>

可以把一个向量或其它对象转换成一个列表,如果向量中的元素已经有了名字,将自动使用这些名字:

> p <- 1:3
> names(p) <- c('x', 'y', 'z')
> p
x y z
1 2 3
> q <- as.list(p)
> q
$x
[1] 1

$y
[1] 2

$z
[1] 3

>