R 的變數可分為原子變數(atomic variable)與遞迴變數(recursive variable)兩種,向量、矩陣與字元等這類較簡單的變數屬於原子變數,而列表這種複合型的變數則屬於遞迴變數。
原子變數與遞迴變數的主要差異在於原子變數中的元素都必須是同一種類型,而遞迴變數的元素則允許各類型變數混雜。
我們可以使用 is.atomic
與 is.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
nrow
、ncol
、NROW
與 NCOL
這幾個函數若作用在列表變數上,其效果跟一般向量一樣:
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.numeric
或 as.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