《Learning R》笔记 Chapter 5 上 list

2018-02-10  本文已影响0人  天火燎原天

从某个角度来说,R中的list对应的是Python中的dictionary。但list是能够利用序号index的,而dict不能。
list就是一个典型的recursive型数据结构。is.atomic(某list)返回FALSE,而is.recursive(某list)返回TRUE。

创建

创建list的基本语法是list (name = value)

> x <- list(
+     2:5 , 
+     month = month.abb ,  # month.abb 和month.name是两个内置变量名
+     df = matrix(1:6 , nrow = 3))
> x
[[1]]
[1] 2 3 4 5

$month
 [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"

$df
     [,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6

使用names()可以查看和更改list的名称。list的length()返回的是names()的长度,而且由于list本身recursive的性质,对其进行算术运算往往是无意义的。

> names(x)
[1] ""      "month" "df"  #没有预先指定的话,预设为空字符串

索引

Index list时的基本手段仍然等同于vector,但我们往往关心的是list中某一项下的具体内容。而对list来说,[]返回的依然是一个list!
只有[[]] 或者 $才能返回下一级的内容!

> x[1]
[[1]]
[1] 2 3 4 5
> x[[2]]
 [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"
> x$mon #不需要打出完整名字
 [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"
> x[['month']]
 [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"

涉及到list中不存在的位置时,结果与index方式有关。在index之前一定要小心。

> x[4]
$<NA>  #创建了新的项目
NULL
> x[[4]] #报错
Error in x[[4]] : subscript out of bounds
> x$days # 也创建了新的项目
NULL

转换

只有在特定条件下list才能和vector相互转化。

增加和删除

使用c()可以直接合并两个list。new_list <- c(list1, list2)。如果有一个参数是vector,会先强制转换为list。使用cbind和rbind会产生不可预期的结果。
在list创建时,可以预先设定 list(some_name = NULL),从而预先留下空位。
一旦创建完毕,list[some_name] <- NULL 的作用是删除some_name这一项。如果一定要留空的话,应当是 list[some_name] <- list(NULL)。注意是[] 不是 [[]] !!!!!

> x[1] = list(NULL) #创建后再修改
> x
[[1]]
NULL
$month
 [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"
$df
     [,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6
上一篇 下一篇

猜你喜欢

热点阅读