在 R 中可以使用的迴圈控制方式主要有 repeat
、while
與 for
這三種,雖然大部分的迴圈計算可以使用 R 的向量化運算來處理,不過在重複執行某區段的程式碼時,還是必須使用到這裡的迴圈控制結構。
repeat
迴圈repeat
迴圈是最簡單的迴圈控制結構,它會讓 R 不斷得執行指定的程式碼,直到遇到 break
中斷迴圈的執行為止:
x <- 0 repeat { message("x = ", x) x <- x + 1 if (x == 5) break }
x = 0 x = 1 x = 2 x = 3 x = 4
當 R 在執行程式時若遇到 break
會直接跳出整個迴圈的執行,若只想要讓 R 跳過當次的迭代,執行下一次的重複動作,可以使用 next
:
x <- 0 repeat { x <- x + 1 if (x %% 2 == 0) next message("x = ", x) if (x > 7) break }
x = 1 x = 3 x = 5 x = 7 x = 9
上面這樣的程式碼會跳過所有 x
是偶數的迭代,只輸出奇數的 x
值。
while
迴圈while
迴圈類似 repeat
,不過它會先檢查指定的條件,在條件為 TRUE
的情況下才會執行迴圈的內容:
x <- 0 while (x != 5) { message("x = ", x) x <- x + 1 }
x = 0 x = 1 x = 2 x = 3 x = 4
在 while
迴圈中,同樣可以使用 break
與 next
:
x <- 0 while ( x < 100 ) { x <- x + 1 if (x %% 2 == 0) next message("x = ", x) if (x > 7) break }
x = 1 x = 3 x = 5 x = 7 x = 9
任何的 repeat
迴圈都可以很簡單的改寫成 while
迴圈,反之亦然,通常如果迴圈至少要執行一次的狀況,就可以使用 repeat
,如果迴圈可能會因為條件判斷不符合而完全不執行,則可使用 while
,這樣可讓程式碼更容易被閱讀。
for
迴圈for
迴圈主要是用在程式執行前就已經知道迭代次數的情況,它在執行時會將輸入向量中的每個元素值逐一指定給迭代變數,然後重複執行迴圈的內容:
for ( x in 0:4 ) { message("x = ", x) }
x = 0 x = 1 x = 2 x = 3 x = 4
如果迴圈的內容只有一行運算式,也可以省略大括號:
for ( x in 0:4 ) message("x = ", x)
x = 0 x = 1 x = 2 x = 3 x = 4
for
迴圈不只可以處理整數,R 任何的向量都可以使用 for
迴圈來處理:
colors <- c("red", "blue", "yellow") for (c in colors) { message("The color is ", c) }
The color is red The color is blue The color is yellow
雖然 for
迴圈的寫法跟 R 的向量化運算類似,但實際上 R 向量化運算的效能跟 C 語言層級的迴圈相當,而 R 的 for
迴圈則不同,其執行效率上會差很多,所以在執行大量運算時,應盡可能避免使用 for
迴圈,改以向量化運算的方式代替。