列表
列表是将数据组织在一个一维集合中,从这个组织方式来看,它与c()函数是相似的。但是,列表并不是将具体的值组织起来,而是组织R对象,如列表、数据框、矩阵、函数、向量等等。
列表非常好用,因为列表可以存放任何类型的数据,都不会出错,这使其成为R中全能型的存储工具。我们可以使用列表来存储任何类型的数据。在R自定义函数中,如果想要返回多个值,需要对返回结果创建一个list,中文为列表。
1-创建列表
创建并填充一个列表:
list函数创建列表的方式和c函数创建向量的方式相似,不同的元素用逗号隔开。
创建列表方法1:
R
> lst <- list(0.5, 0.841, 0.977)
> lst
[[1]]
[1] 0.5
[[2]]
[1] 0.841
[[3]]
[1] 0.977
我自己的理解:可以将列表和c()函数结合来理解列表。c()是用来创建向量的,c意味着combine,将相同的数据类型结合在一起,构成一个向量。列表呢,允许有不同的数据类型,也就是说,构成列表的元素,可以是向量,字符串,数据框,列表。。。,任何R对象都是可以的。c()函数的每个元素只能放字符串、数字等,并且要求c()中的所有元素数据类型必须是一样的,术语为数据同质。可以将c()中的每个元素想象成一个房间,只能放一个东西的房间;将list()中的每个元素可以想象成一个三居室或者别墅,可以放多个东西的大house。
列表的返回值,使用双括号用于提示,现在展示的是列表的第几个元素,在这个元素下面存放的具体数据是什么,上面的这个R代码例子中,列表的每个元素存放的是数字,该列表共有三个元素。
列表的这种双括号索引系统,是因为列表的元素可以是任意一种R对象,这个R对象可能是一个自己有索引系统的向量或者列表。
列表可以包含复杂对象,而不仅仅是基本数据值。
例如:
R
mods <- list( lm(x ~ y1), lm(x~y2), lm(x~y3))
列表可以存放R的任何对象
R
> lst <- list(0.5, 0.841, 0.977)
> lst
[[1]]
[1] 0.5
[[2]]
[1] 0.841
[[3]]
[1] 0.977
> lst <- list(3.14, "mod", c(1,4,3), mean)
> lst
[[1]]
[1] 3.14
[[2]]
[1] "mod"
[[3]]
[1] 1 4 3
[[4]]
function (x, ...)
UseMethod("mean")
<bytecode: 0x00000281e1d69b20>
<environment: namespace:base>
上面这个例子中,可以看到,这个列表,存放了四个元素,第一个元素是个数字,第二个元素存放了一个字符串,第三个元素中存放了一个向量,第四个元素中存放了函数。
创建列表方法2:
可以先创建一个空的列表,然后将列表相应元素赋值来构造列表。
R
> lst <- lst()
> lst[[1]] <- 3.14
> lst[[2]] <- "Moe"
> lst[[3]] <- c(1,1,2,3)
> lst[[4]] <- mean
> lst
[[1]]
[1] 3.14
[[2]]
[1] "Moe"
[[3]]
[1] 1 1 2 3
[[4]]
function (x, ...)
UseMethod("mean")
<bytecode: 0x00000281e1d69b20>
<environment: namespace:base>
注意:访问列表的元素,一定是列表名+双括号,可以想象成是拿到钥匙,进入这个大house,要往这个大house中存放东西。
列表元素可以明明,list函数允许为每个元素提供名称,c()函数中每个元素也可以提供名称。
R
> lst <- list(mid=0.5, right=0.84, far.right = 0.977)
> lst
$mid
[1] 0.5
$right
[1] 0.84
$far.right
[1] 0.977
关于列表的记忆方法,在《R语言入门与实践》4.4节美元符号与双中括号中介绍到,"将列表对象想象成一列火车是十分有用的。使用单中括号相当于选择某节车厢(车头+车厢:还是一列火车,即还是一个列表,从数学集合概念角度理解,可以理解成单中括号得到的是 原始列表的子集,即仍是一个列表),而使用双中括号则相当于选择某节车厢里的的内容。(不带火车头,是里面存放的内容)"
2-访问列表
根据位置访问列表元素
R
lst[[n]] #访问列表的第n个元素的内容,返回的是列表第n个元素的内容
lst[n] #返回一个元素的列表,即是lst原始列表的子集
lst[c(1,4,5)] #返回三个元素的列表,即是lst原始列表的子集
#若name是列表某个元素的名字,可以通过美元号和双中括号访问
lst$name
lst[["name"]]
参考:
<R语言经典实例>(原书第2版)(2020年5月出版--机械工业出版社)(这本书不错,简短易懂。)
《R语言入门与实践》(2016年6月出版--人民邮电出版社)(这本书不错,对于初学/理解R对象(向量、数据框、矩阵、列表)非常有帮助!)