迴圈控制

在 R 中可以使用的迴圈控制方式主要有 repeatwhilefor 這三種,雖然大部分的迴圈計算可以使用 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 迴圈中,同樣可以使用 breaknext

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 迴圈,改以向量化運算的方式代替。