vector 是 R 裡面最「簡單」的資料結構。有時候我們需要比較更複雜的資料結構處理我們遇到的資料,例如,我們或許需要儲存不同資料類型或是具有階層結構的資料。面對這兩種需求,vector 無能為力,因此需要用到 R 的 list。
list()
去製造出 list。list()
的使用方式很類似用來製造 vector 的 c()
,但與 c()
不同的是,list()
list()
裡面可以放入另一個 list()
#> [[1]]
#> [1] TRUE
#>
#> [[2]]
#> [1] 1 2 3
#>
#> [[3]]
#> [1] "Hello"
#> $kai
#> [1] TRUE
#>
#> $joy
#> [1] 1 2 3
#>
#> $jess
#> [1] "Hello"
#> [[1]]
#> [1] 1.1
#>
#> [[2]]
#> [[2]][[1]]
#> [1] 2.1
#>
#> [[2]][[2]]
#> [1] "Hello"
通常我們會習慣為 list 加上名字 (names
),幫助我們更容易處理這種比較複雜的資料結構
[]
: 與 vector 一樣,我們可以透過 lst[<char vector of names>]
、lst[<integer vector>]
或 lst[<logical vector>]
去 subset list
#> $single
#> [1] FALSE
#> $single
#> [1] FALSE
#>
#> $tags
#> [1] "ig" "selfie"
#> $age
#> [1] 20
#>
#> $tags
#> [1] "ig" "selfie"
就像 vec[<some vector>]
會回傳一部分的 vector (sub-vector);lst[<some vector>]
也會回傳一部分的 list (sub-list)。換言之,使用 []
時,回傳值的資料結構不會改變。
我們可以將 list 想像成一列火車,每節車廂是一個長度為 1 的 sub-list,車廂裡面是這個 sub-list 儲存的值。欲取得 sub-list,使用的是 []
;欲取得 sub-list 裡面的值 (i.e. 脫去外層的 list),需使用 [[]]
# 回傳 sub-list
typeof(ben["tags"])
ben["tags"]
# 回傳 list 之內的「值」,在此為一個 char vector
typeof(ben[["tags"]])
ben[["tags"]]
#> [1] "list"
#> $tags
#> [1] "ig" "selfie"
#>
#> [1] "character"
#> [1] "ig" "selfie"
lst[["<name>"]]
有另一種更簡便的寫法:lst$<name>
, e.g. ben[["tags"]]
可改寫成 ben$tags