R言語で繰り返しの処理を行う方法を解説します。
この記事ではfor文、while文、repeat文の使用例について見ていきます。
繰り返しの処理の具体例を交えて、R言語のfor文、while文、repeat文の記述の仕方や使う場面について説明していきます。
この記事で解説するプログラミングコードは以下からダウンロードできます。
R言語 for文・while文・repeat文
if文については次の記事を参照してください。
繰り返しの処理
R言語にはfor文、while文、repeat文といった繰り返し処理のための文がサポートされています。
それぞれの文を構成する要素を以下にまとめました。
for文
for文は、以下のようにベクトルやリストなどのシークエンスの各要素について繰り返し処理を行います。
他の言語のforeachのような動きをします。
var | 繰り返し処理を行う対象であるseqの各要素の変数名。 |
seq | ベクトルやリストなどのシークエンス。factorの値はcharacter型のベクトルに変換される。R 4.0.0かlong vectorもサポートされている。 |
expr | { expr1 ; expr2 }の形式の表現(expression)。 |
while文
while文はある条件の下で繰り返し処理を行います。
cond | NAではない長さが1のロジカル型のベクトル(R 4.2.0から長さが1より大きいベクトルの場合エラーとなる)。ロジカル型に変換可能な型についても対応している。 |
expr | { expr1 ; expr2 }の形式の表現(expression)。 |
repeat文
repeat文はbreakなどのループから抜ける処理がない限り、繰り返し処理をし続けます。
expr | { expr1 ; expr2 }の形式の表現(expression)。 |
実行例
繰り返しの処理の実行例について見ていきます。
for文、while文、repeat文のそれぞれの使い方をまとめました。
for文
まず、for文の実行例について紹介します。
R言語のfor文は次のように他の言語のforeach文に対応します。
ベクトルやリストの各要素に対して繰り返しの処理を行うようになっています。
他の言語の通常のfor文のようにインデックスを1つずつインクリメントしながら繰り返しの処理を行いたい場合は、次のようにseq_lenなどで数値の列(シークエンス)をfor文のin以降に指定します。
1 2 3 4 5 6 | x <- NULL for (idx in seq_len(10)) { x[idx] <- idx print(paste0(idx, "th compoent: ", x[idx])) } |
上を実行するとベクトルxの1から10までの要素に1から10の数値が代入されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | > #例1 > x <- NULL > for (idx in seq_len(10)) { + x[idx] <- idx + print(paste0(idx, "th compoent: ", x[idx])) + } [1] "1th compoent: 1" [1] "2th compoent: 2" [1] "3th compoent: 3" [1] "4th compoent: 4" [1] "5th compoent: 5" [1] "6th compoent: 6" [1] "7th compoent: 7" [1] "8th compoent: 8" [1] "9th compoent: 9" [1] "10th compoent: 10" > x [1] 1 2 3 4 5 6 7 8 9 10 |
数値のベクトルではなく文字列のベクトルに対してもfor文を適用することができます。
1 2 3 4 5 6 | alphabet <- "" for(char in letters[seq_len(10)]) { alphabet <- paste0(alphabet, char) print(char) } |
実行例は次の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | > alphabet <- "" > for(char in letters[seq_len(10)]) { + alphabet <- paste0(alphabet, char) + print(char) + } [1] "a" [1] "b" [1] "c" [1] "d" [1] "e" [1] "f" [1] "g" [1] "h" [1] "i" [1] "j" > alphabet [1] "abcdefghij" |
同様に任意のベクトルやリストに対してfor文で繰り返しの処理を行うことができます。
また、breakを用いることで途中でforループを抜けることが可能です。
次の例では、ベクトルnumbersの要素の和を計算していますが、先頭からの和が10を超えたところで計算を止めるように制御しています。
1 2 3 4 5 6 7 8 9 10 11 12 | #例2 numbers <- c(1, 1, 2, 2, 3, 3, 4, 4, 5, 5) sum_numbers <- 0 for(number in numbers) { if (sum_numbers > 10) { print("break!") break } sum_numbers <- sum_numbers + number print(paste0("sum of numbers: ", sum_numbers)) } |
実行結果は以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | > #例2 > numbers <- c(1, 1, 2, 2, 3, 3, 4, 4, 5, 5) > sum_numbers <- 0 > for(number in numbers) { + if (sum_numbers > 10) { + print("break!") + break + } + sum_numbers <- sum_numbers + number + print(paste0("sum of numbers: ", sum_numbers)) + } [1] "sum of numbers: 1" [1] "sum of numbers: 2" [1] "sum of numbers: 4" [1] "sum of numbers: 6" [1] "sum of numbers: 9" [1] "sum of numbers: 12" [1] "break!" > sum_numbers [1] 12 |
nextを用いることで処理をスキップし次のループに移ることができます。
次は1から10までの偶数の和を計算する例です。
奇数の際はnextで次のループに移るように制御しています。
1 2 3 4 5 6 7 8 9 10 11 | #例3 sum_even <- 0 for (number in seq_len(10)) { if (number %% 2 != 0) { print("next!") next } sum_even <- sum_even + number print(paste0("sum of even numbers: ", sum_even)) } |
実行すると1から10までの偶数の和が計算できていることが分かります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | > #例3 > sum_even <- 0 > for (number in seq_len(10)) { + if (number %% 2 != 0) { + print("next!") + next + } + sum_even <- sum_even + number + print(paste0("sum of even numbers: ", sum_even)) + } [1] "next!" [1] "sum of even numbers: 2" [1] "next!" [1] "sum of even numbers: 6" [1] "next!" [1] "sum of even numbers: 12" [1] "next!" [1] "sum of even numbers: 20" [1] "next!" [1] "sum of even numbers: 30" > sum_even [1] 30 |
while文
while文を用いることで、特定の条件が成り立つ限り処理を繰り返し続けることが可能です。
while文の書き方は次のように()の中に条件式を指定します。
この条件式が成り立つときwhileループが実行され続けます。
while文を用いるときは、終了するような条件がない場合無限ループとなってしまう点に注意する必要があります。
次の例は1から9までの連続する数の和を計算しています。
1 2 3 4 5 6 7 8 9 | #例1 x <- 0 sum_x <- 0 while (x < 10) { sum_x <- sum_x + x print(paste0("sum of the sequence to ", x, ": ", sum_x)) x <- x + 1 } |
上を実行すると、1から9までの連続する数の和である45が計算できていることが分かります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | > #例1 > x <- 0 > sum_x <- 0 > while (x < 10) { + sum_x <- sum_x + x + print(paste0("sum of the sequence to ", x, ": ", sum_x)) + x <- x + 1 + } [1] "sum of the sequence to 0: 0" [1] "sum of the sequence to 1: 1" [1] "sum of the sequence to 2: 3" [1] "sum of the sequence to 3: 6" [1] "sum of the sequence to 4: 10" [1] "sum of the sequence to 5: 15" [1] "sum of the sequence to 6: 21" [1] "sum of the sequence to 7: 28" [1] "sum of the sequence to 8: 36" [1] "sum of the sequence to 9: 45" > sum_x [1] 45 |
条件式だけでなくbreakでもループから抜けることが可能です。
次の例では、ベクトルxのインデックスがxの長さ以下のときに繰り返す処理を行っていますが、while文中のifでインデックスが5のときにbreakしwhileループから抜けるように制御しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 | #例2 x <- c("a", "a", "c", "a", "b", "a", "c", "c", "b", "a") idx <- 1 counter <- 0 while (idx < length(x)) { if (idx == 5) break if (x[idx] == "a") { counter <- counter + 1 print(paste0("found a at ", idx, "th component of x")) } idx <- idx + 1 } |
実行するとxの5番目の要素までの"a"の数を計算しているのが確認できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | > #例2 > x <- c("a", "a", "c", "a", "b", "a", "c", "c", "b", "a") > idx <- 1 > counter <- 0 > while (idx < length(x)) { + if (idx == 5) break + if (x[idx] == "a") { + counter <- counter + 1 + print(paste0("found a at ", idx, "th component of x")) + } + idx <- idx + 1 + } [1] "found a at 1th component of x" [1] "found a at 2th component of x" [1] "found a at 4th component of x" > counter [1] 3 |
repeat文
最後にrepeat文について見ていきます。
repeat文はwhile文の条件式にTRUEが与えられた場合と同じであり、デフォルトで無限ループを実行します。
braekでループから抜けるような処理を書く必要があります。
while文で行った処理をrepeat文で記述すると次のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 | x <- 0 sum_x <- 0 repeat { if (x >= 10) { print("break!") break } sum_x <- sum_x + x print(paste0("sum of the sequence to ", x, ": ", sum_x)) x <- x + 1 } |
if文とbreakで終了条件を指定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | > x <- 0 > sum_x <- 0 > repeat { + if (x >= 10) { + print("break!") + break + } + sum_x <- sum_x + x + print(paste0("sum of the sequence to ", x, ": ", sum_x)) + x <- x + 1 + } [1] "sum of the sequence to 0: 0" [1] "sum of the sequence to 1: 1" [1] "sum of the sequence to 2: 3" [1] "sum of the sequence to 3: 6" [1] "sum of the sequence to 4: 10" [1] "sum of the sequence to 5: 15" [1] "sum of the sequence to 6: 21" [1] "sum of the sequence to 7: 28" [1] "sum of the sequence to 8: 36" [1] "sum of the sequence to 9: 45" [1] "break!" |
まとめ
R言語で繰り返しの処理を行う方法を紹介しました。
R言語では繰り返しの処理のためにfor文、while文、repeat文が用意されています。
Rのfor文は、他の言語のforeachのように記述します。ベクトルやリストの各要素についてforループを行うものとなっています。
また、repeat文はwhile文の条件式が常にTRUEであり、使用する際は無限ループにならないように注意が必要です。