從某個角度來說,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