R軟體for迴圈的迷思

許多人認為學會過了程式設計,就能夠駕馭R 語言!殊不知R 語法有其特殊性,更遑論背後的統計模型與繪圖專業了。舉例來說,下面就是標準的不良R 程式(canonical bad Rprogram),用來計算a 與b 兩向量的內積:

> (a <- 1:5) 

[1] 1 2 3 4 5

> (b <- 5:1)

[1] 5 4 3 2 1

 

> d <- NULL

> for ( i in 1:length(a)) {

+ d[i] <- a[i] * b[i]

+ }

>d

[1] 5 8 9 8 5

 

> s <- 0

> for (i in 1:length(d)) {

+ s <- s+d[i]

+ }

> s

[1] 35

傳統的兩次迴圈設計,當資料量大時,會大幅影響執行時間。其實善用R 的向量化(vectorization)特性,一到兩行的指令即可快速輕易地算出向量內積了。(註:因資料量很小,此例感受不到速度的差異!)

> (d <- a * b)

[1] 5 8 9 8 5

> (s <- sum(a * b)

[1] 35

 

以程式執行效率的觀點來看,R的世界非不得已 (指當無法運用apply系列函數與vectorization特性時) 才會使用for迴圈。

 

撰文者:
鄒慶士 博士
現任:
北商資訊與決策科學所教授
中華 R 軟體學會理事長
信箱:
vince.tsou@gmail.com