20200506·Kony·Win10
列表(list):
列表为最复杂的数据类型,是一些对象或成分的有序集合,例如可以是向量,矩阵,数据框,或其他列表的组合。
用list()创建:mylist<-list(object1,object2,...), 或命名列表:mylist<-list(name1=object1,name2=object2,...)。
创建列表
g<-"My First List"
h<-c(25,26,18,39)
j<-matrix(1:10,nrow=5)
k<-c("one","two","three")
mylist<-list(title=g,ages=h,j,k)
mylist #输出列表
## $title
## [1] "My First List"
##
## $ages
## [1] 25 26 18 39
##
## [[3]]
## [,1] [,2]
## [1,]1 6
## [2,]2 7
## [3,]3 8
## [4,]4 9
## [5,]5 10
##
## [[4]]
## [1] "one" "two" "three"
显示列表数据
mylist[1]
## $title
## [1] "My First List"
mylist[2]
## $ages
## [1] 25 26 18 39
mylist[[2]]
## [1] 25 26 18 39
mylist["ages"]
## $ages
## [1] 25 26 18 39
mylist[[2]][1] # 第取第2列第1个元素
## [1] 25
删除列表数据
将需要删除的内容直接赋值为NULL即可
g<-"My First List"
h<-c(25,26,18,39)
j<-matrix(1:10,nrow=5)
k<-c("one","two","three")
mylist<-list(title=g,ages=h,j,k)
mylist
## $title
## [1] "My First List"
## $ages
## [1] 25 26 18 39
## [[3]]
## [,1] [,2]
## [1,] 1 6
## [2,] 2 7
## [3,] 3 8
## [4,] 4 9
## [5,] 5 10
## [[4]]
## [1] "one" "two" "three"
mylist$ages
## [1] 25 26 18 39
mylist$ages <- NULL
mylist
## $title
## [1] "My First List"
## [[2]]
## [,1] [,2]
## [1,] 1 6
## [2,] 2 7
## [3,] 3 8
## [4,] 4 9
## [5,] 5 10
## [[3]]
## [1] "one" "two" "three"
判断列表完整
使用complete.cases()函数可以判断一个列表是否完整,但是,此函数要求列表的所有行长度都相等,如下所示
h<-c(25,26,NA,NA)
k<-c("one","two","three","four")
mylist<-list(ages=h,k)
complete.cases(mylist)
## [1] TRUE TRUE FALSE FALSE
更多情况下,complete.cases()函数用于判断数据框是否有缺失值
test <- data.frame(h<-c(25,26,NA,NA),
k<-c("one","two","three","four"))
complete.cases(test)
##[1] TRUE TRUE FALSE FALSE
do.call()
do.call()函数可以根据名称或函数以及要传递给它的一个列表参数构建并执行一个函数的调用,它的用法如下所示:
do.call(what, args, quote = FALSE, envir = parent.frame())
参数说明
1、what:函数或者是一个要调用函数的名称的字符串;
2、args:列表(list)参数,是函数执行的对象;
3、quote:逻辑值,用于指定是否引用参数,默认情况下是FALSE,如果是FALSE,那么do.call()就会检测调用环境中的参数,而非envir中的参数。如果参数为TRUE,那么前面每个参数都会引用,
4、envir:调用的函数。如果what参数是一个字符串,参数是一个符号或引号的表达式,envir这个参数比较有用。
案例一
do.call("complex", list(imag = 1:3))
[1] 0+1i 0+2i 0+3i #complex表示复数,这也是一个函数,list(imag=1:3)则是生成一个列表,并且将列表中的元素转换为复数。
案例二
如果我们已经有了一个数据框,可以通过c()函数添加另外的参数
tmp <- expand.grid(letters[1:2], 1:3, c("+", "-"))
tmp
# Var1 Var2 Var3
# 1 a 1 +
# 2 b 1 +
# 3 a 2 +
# 4 b 2 +
# 5 a 3 +
# 6 b 3 +
# 7 a 1 -
# 8 b 1 -
# 9 a 2 -
# 10 b 2 -
# 11 a 3 -
# 12 b 3 -
do.call("paste", c(tmp, sep = ""))
# [1] "a1+" "b1+" "a2+" "b2+" "a3+" "b3+" "a1-" "b1-" "a2-" "b2-" "a3-" "b3-"
do.call(paste, list(as.name("A"), as.name("B")), quote = TRUE)
# [1] "A B"
#在这个案例中,先创建了一个tmp数据框,然后调用了paste()函数,并且添加了""
案例三
注意参数what加引号与不加引号的作用
A <- 2
f <- function(x) print(x^2)
env <- new.env()
assign("A", 10, envir = env)
assign("f", f, envir = env)
f <- function(x) print(x)
f(A) # 2
[1] 2
do.call("f", list(A)) # 2
[1] 2
# 在env里,加引号和不加引号是有区别的
# 加引号,代表引用的是env里的
do.call("f", list(A), envir = env) # 4
[1] 4
do.call(f, list(A), envir = env) # 2
[1] 2
# 不加引号,代表是parent.frame()里的f
do.call("f", list(quote(A)), envir = env) # 100
[1] 100
do.call(f, list(quote(A)), envir = env) # 10
[1] 10
do.call("f", list(as.name("A")), envir = env) # 100
[1] 100
eval(call("f", A)) # 2
[1] 2
eval(call("f", quote(A))) # 2
[1] 2
eval(call("f", A), envir = env) # 4
[1] 4
eval(call("f", quote(A)), envir = env) # 100
[1] 100
参考资料
笔记参考1:RVDSD的个人笔记
笔记参考2:R语言基础-数据类型之列表
笔记参考3:do.call函数
do.call函数?