原子變數與遞迴變數

R 的變數可分為原子變數(atomic variable)與遞迴變數(recursive variable)兩種,向量、矩陣與字元等這類較簡單的變數屬於原子變數,而列表這種複合型的變數則屬於遞迴變數。

原子變數與遞迴變數的主要差異在於原子變數中的元素都必須是同一種類型,而遞迴變數的元素則允許各類型變數混雜。

我們可以使用 is.atomicis.recursive 來檢查變數是屬於哪一種:

is.atomic(list())
[1] FALSE
is.recursive(list())
[1] TRUE

列表的維度與運算

列表變數的長度(元素個數)可以使用 length 函數取得:

x.list <- list(1:3, "G.T.Wang", matrix(3:6, nrow = 2), sin)
length(x.list)
[1] 4

length 函數在計算巢狀結構的列表長度時,只會傳回第一層的長度:

y.list <- list(
  var1 = list( name = "pi", val = pi),
  var2 = list( name = "e", val = exp(1))
)
length(y.list)
[1] 2

列表只有長度的屬性,沒有維度的屬性:

dim(x.list)
NULL

nrowncolNROWNCOL 這幾個函數若作用在列表變數上,其效果跟一般向量一樣:

nrow(x.list)
NULL
ncol(x.list)
NULL
NROW(x.list)
[1] 4
NCOL(x.list)
[1] 1

由於列表的元素是由各種不同類型的變數所組成,所以列表變數之間不能直接互相進行運算,我們只能將列表的元素取出後,再單獨進行運算:

z.list <- list(c(1:3), c(2:4))
z.list[[1]] + z.list[[2]]
[1] 3 5 7

向量與列表的轉換

若要將向量變數轉換為列表變數,可以使用 as.list 函數:

x.vector <- c(3, 6, 8)
as.list(x.vector)
[[1]]
[1] 3

[[2]]
[1] 6

[[3]]
[1] 8

如果一個列表中每個元素都是很單純數值或字元等變數,就可以使用 as.numericas.character 這類的函數將其直接轉換為一般的向量:

as.numeric(list(3, 6, 8))
[1] 3 6 8

如果列表中的元素不是單純的純量變數,就要改用 unlist 函數:

y.list <- list(
  foo = 2,
  bar = c(3, 6, 9)
)
unlist(y.list)
 foo bar1 bar2 bar3 
   2    3    6    9

合併列表

若要將多個列表變數合併成一個,可以使用 c 函數:

c(list(a = 1, b = 2), list(c = 3), list(4))
$a
[1] 1

$b
[1] 2

$c
[1] 3

[[4]]
[1] 4

如果使用 c 函數合併列表與向量變數,則所有的向量變數會先自動被轉換成列表之後,才跟其餘的列表合併:

c(list(a = 1, b = 2), 3, 4)
$a
[1] 1

$b
[1] 2

[[3]]
[1] 3

[[4]]
[1] 4