30. 繰り返し文


for による繰り返し

ある処理を繰り返し行いたい場合,同じ文を何度も書く代わりに for 文を使う.

でリストの要素の一番目から順に要素をループ変数にスタックして for 文中の式を実行し,リストの要素が無くなった時点で for ループから抜けるという動作をする.よって繰り返し回数は「リストの要素数」となる.

ごく一般的なプログラム言語の繰り返しアルゴリズムと多少異なる.

例えば,ループ範囲に整数値のベクトルを指定すると,x に 1 を 5 回足すことが出来る.

 
 x <- 0                        
 for (i in 1:5) {              # for (ループ変数 in ベクトルやリスト)
   x <- x + 1                  # ベクトルやリストの要素が空にならない限り式が繰り返される
 }                             
 x

[1] 5

ループ範囲を表すベクトルやリストの要素は for 文が始まる際に for 文中でループ範囲を表すベクトルやリストの要素を変更しても,変数に代入される値(オブジェクト)は変化しない.例えば以下のように,ループ変数 x を変更しても i は x の最初の値である 1 から 5 が順に代入される.よって,左下と右下は同じ結果を返すことになる.

 
 x <- 1:5
 for (i in x) x <- append(x, i)
 x

[1] 1 2 3 4 5 1 2 3 4 5

 x <- 1:5
 for (i in 1:5) x <- append(x, i)
 x

[1] 1 2 3 4 5 1 2 3 4 5

for ループのループ範囲には行列や配列,リストを指定することも出来る(実際はベクトルとしてアクセスする).また,何故か文字ベクトルやグラフィックス用のオブジェクトを指定することも出来る.以下に示す通り,関数 plot() に対応したオブジェクトなら,plot() で順次異なるグラフを書かせたりも可能である.文字や論理値が混在したリストでも構わない(一番上位のモードに揃えられる).

 
 x <- 0
 y <- matrix(1:10, 2, 5)
 for (i in y) x <- x+1
 x

[1] 10
 
 par(mfrow=c(2,2))
 x <- list(1:6, sin, runif(6), dnorm)
 for (i in x) {
   plot(i, xlim=c(0,2*pi))
 }

while による繰り返し

同じ繰り返しでも,ある条件が成り立っている間中ずっと「繰り返す式」を繰り返す場合は while 文を使う.ただし,条件式が TRUE しかとり得ない場合は,プログラムが永遠に実行され続けて暴走してしまうので注意が必要である.例えば以下を実行すると x の各要素に 1 を 5 回足すことが出来る.

 
 x <- 0
 while (x <= 5) {         # while ( 条件式 )
   x <- x + 1             # 条件式が TRUE である限り式が繰り返される
 }                        # 最初に条件式が FALSE ならば式は 1 回も実行されない
 x

[1] 6

break を用いて繰り返し文から抜ける

break 文によって,for や while 等の「繰り返し文」の途中で繰り返しから抜け,next 文によって,for や while 等の「繰り返し文」の途中で,強制的に次の「繰り返し文」に移ることが出来る

break 文が評価されると,その時点で最も内側の繰り返しから抜けることになる.また,next 文が評価された時点でそれ以降の処理は中止され,「繰り返し文」の先頭に戻って次の繰り返しが開始される.

 
 x <- 0
 for (i in 1:5) {
   x <- x + 1
   if (x == 3) break    # x が 3 になったら
 }                      # for 文から抜ける
 x

[1] 3

 x <- 0
 for (i in 1:5) {
   next                 # x に 1 を足す前に
   x <- x + 1           # 次の繰り返しが開始
 }
 x

[1] 0

repeat による繰り返し

repeat 文はそのままでは無制限に繰り返しを行なう.処理を止めるには break 文を用いる.

 
 x <- 0
 repeat {
   if (x <= 5) x <- x+1   # break 文が見つかるまで式が繰り返される
   else        break      # x > 5 ならば repeat 文から抜ける
 }
 x

[1] 6