Rの反復処理について
反復処理とはその名の通り、処理を反復(繰り返す)ことをいいます。反復処理は大きく分けてfor文とwhile文に分かれます。for文とwhile文の処理の流れはそれぞれ次のようになります。
for文
- 集合を与える
- 集合の要素を1つ取り出す
- 所定の処理を実行し、終了したら2に戻る
- 集合の要素がなくなるまで2と3を反復する
while文
- 条件を与える
- 条件の真偽判定を行う
- 条件が真(TRUE)ならば所定の処理を実行し、終了したら2に戻る
- 条件が偽(FALSE)ならばwhile文を終了する
for文とwhile文の特徴の1つは、for文は反復処理の回数があらかじめ分かるのに対し、wihile文は条件の真偽判定が行われるまで反復処理の回数が分からない(ときには無限回、これを無限ループといいます)ことです。
for文とwhile文は、あらゆるプログラミング言語で使用されていますが、実のところ、R言語においては使用する機会はあまり多くありません。なぜならば、R言語は統計解析向けのプログラミング言語であり、処理の多くはデータフレーム上の操作となるからです。しかし、for文に関してはデータフレームの各列を個別にグラフにして保存したいときなどに、たまに使用する機会がありますので、習得が望ましいと思います。while文の習得に関しては、かなり優先度が下がります。
余談
すでにR言語以外のプログラミング言語を習得している方へ、補足事項をお伝えします。
R言語ではfor文による無限ループは記載できません。また、R言語にはdo-while文はありません。
for文
for文の解説は上記でしました。ここでは、for文の書き方や、反復処理に必須のnextとbreakキーワードについて見ていきます。
for文の書き方
for文の書き方は次になります。
for (要素を格納する変数 in 集合) {
処理1
処理2
処理3
}
次は、変数iが要素を格納する変数となり、1:5(={1, 2, 3, 4, 5})が集合になります。
for (i in 1:5) {
(con) print(i)
(con)}
(out)[1] 1
(out)[1] 2
(out)[1] 3
(out)[1] 4
(out)[1] 5
次は、変数xが要素を格納する変数となり、c(“first”, “second”, “third”)が集合になります。
for (x in c("first", "second", "third")) {
(con) print(x)
(con)}
[1] "first"
[1] "second"
[1] "third"
next
nextはfor文とともに記載されるキーワードです。nextの意味は、処理がnextに来たときに、そのあとの処理を実行せずに集合から要素を取り出すところまで戻ります。次のサンプルコードは集合{1, 2, 3, 4, 5}から要素を1つ取り出して変数iに格納して所定の処理を実行しますが、変数iが3未満の場合はそれ以降の処理を実行していないことを確認してください。
for (i in 1:5) {
(con) if ( i < 3) {
(con) next
(con) }
(con) print(i)
(con)}
(out)[1] 3
(out)[1] 4
(out)[1] 5
break
nextはfor文とともに記載されるキーワードです。breakの意味は、処理がbreakに来たときに、for文の処理そのものを終了させます。次のサンプルコードは集合{“first”, “second”, “third”}から要素を1つ取り出して変数xに格納して所定の処理を実行しますが、変数xが”second”のときにはfor文を終了させていることを確認してください。
for (x in c("first", "second", "third")) {
if (x == "second") {
break
}
print(x)
}
[1] "first"
while文
while文の解説は上記でしました。ここでは、while文の書き方を見ていきます。上記のfor文のところで解説したnextとbreakキーワードはwhile文についても同様に使用できます。
while文の書き方
while文の書き方は次になります。
while (条件) {
処理1
処理2
処理3
}
次のサンプルコードでwhile文の動作を確認します。変数iに初期値0が格納されています。while文の条件判定から真(TRUE)となるので{}内に処理が進みます。{}内で変数iに値1が加算され、変数iを出力して所定の処理を終えます。その後、再度while文の条件判定を行い・・・ということをwhile文の条件判定が偽(FALSE)になるまで繰り返します。
i <- 0
while (i < 5) {
i <- i + 1
print(i)
}
(out)[1] 1
(out)[1] 2
(out)[1] 3
(out)[1] 4
(out)[1] 5
ちなみに、このサンプルコードで「i <- i + 1」の記載がないと無限ループになって「[1] 0」が永遠に出力されます。