分類: R

R 列表變數與 Data Frames

原子變數與遞迴變數

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

Page: 1 2 3 4 5

G. T. Wang

個人使用 Linux 經驗長達十餘年,樂於分享各種自由軟體技術與實作文章。

Share
Published by
G. T. Wang

Recent Posts

[DIY] 自製凡士林火種

這裡介紹如何利用簡單的凡士林與...

3 年 ago

[DIY] 自製火影木葉、砂忍者村標誌雕刻木牌

本篇記錄我用路邊撿來的樟木與龍...

3 年 ago

收集龍眼木修剪枝幹用於木頭工藝

最近打算帶著阿玄做一些木工作品...

3 年 ago

[DIY] 樟木手工自製迷你手裏劍(忍者武器)

本篇記錄阿玄第一次使用木工工具...

3 年 ago

[DIY] 龍眼木手工自製木槌

本篇記錄我用自己砍的龍眼木還有...

3 年 ago

[DIY] 樟木手工自製苦無(忍者武器)

本篇記錄我自己用樟木的枝幹,以...

3 年 ago