参考资料:学习R
1、创建列表
列表有list函数创建,且能向c函数那样指定内容。我们只需要简单地用逗号分隔每个参数即可指定列表中的内容。列表中的元素变量的类型不限,可以是向量、矩阵,甚至是函数:
a_list<-list(
c(1,1,2,5,14,42),
month.abb,
matrix(c(3,-8,1,-3),nrow=2),
asin
)
print(a_list)
与向量的命名类似,我们可以在构造列表时就给元素命名,也可以在构造之后使用names函数命名:
the_same_list<-list(
catalan=c(1,1,2,5,14,42),
months=month.abb,
involutary=matrix(c(3,-8,1,-3),nrow=2),
arcsin=asin
)
print(the_same_list)
建议我们在给元素命名时最好使用有效的变量名(有意义的变量名)。
2、原子变量和递归变量
由于列表具有把其他列表包含在内的能力,他被认为是递归变量。与之相对,向量、矩阵和数组则是原子变量。函数is.recursive和is.atomic可测试变量是哪种类型。
3、列表的维度和算术运算
列表与向量一样,也是有长度的,其长度是列表顶层元素的数目。
列表没有维度。因此把dim函数作用于列表上则返回NULL。
length(a_list)
dim(a_list)
nrow(a_list)
ncol(a_list)
NROW(a_list)
NCOL(a_list)
与向量不同的是,算术运算对列表不起作用。由于每个元素的类型可以不同,将两个列表相加或相乘没有任何意义。
4、索引列表
与向量类似,我们可以通过方括号[]、正或负下标数字、元素名称或逻辑值这四种方法访问列表中的元素:
l<-list(
first=1,
second=2,
third=list(
alpha=3.1,
beta=3.2
)
)
l[1:2]
l[-3]
l[c('first','second')]
l[c(TRUE,TRUE,FALSE)]
有时候,我们需要访问的列表元素中的内容。有两个操作符能帮助我们做到这一点:可用双方括号[[]]传入正整数,它代表返回的索引下标,或指定该元素的名称字符串,如下:
如果输入的是一个列表,is.list函数将返回TRUE,否则将返回FALSE。作为比较我们看下面两个索引操作符:
对于列表的命名元素,我们也可以使用美元符号运算符$。这与向双方括号传入一个命名字符串的工作方式是一样的,且有两个好处:首先,许多IDE能自动补全名字;其次,R能接受部分匹配的元素名称(尽量不要用):
我们还可以通过嵌套方括号或传入向量来方位嵌套元素:
当尝试不存在的元素列表时,系统会根据我们所使用的索引类型,行为略有不同:
当我们使用单方括号的索引,那么将返回只带一个NULL元素的列表。无论是以双方括号还是美元符号来访问元素的内容,如果名字错误,都会返回NULL。
如果一错误的数字进行双方括号的索引,则会报错
5、向量和列表之间的转换
向量可使用函数as.list来转换成列表。所创建的可见列表与向量中元素的值一一对应:
如果列表中每个元素都是标量值,则也可以使用之前出现过的函数(as.numeric、as.character等)将其转换为向量。
如果列表中包含非标量元素,这种方法将不起作用。对于这样的列表,可用unlist函数将其转换为何量(对于混合类型的列表, 有时技术上可行, 但没什么用)
6、组合列表
c函数既能用于拼接向量,亦能用于拼接列表:
如果我们用它来拼接列表和向量,向量在拼接之前讲被转换为列表(就像调用了as.list函数):