《Learning R》筆記 Chapter 5 上 list

從某個角度來說,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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容