二重ループ
CoddyのRジャーニー「基礎」セクションの一部。レッスン 44/78。
ループの中に別のループを置くことで、入れ子のループを作成できます。内側のループは、外側のループの反復ごとに最後まで実行されるため、組み合わせやグリッド状のパターンを扱うときに便利です。
rows <- 3
cols <- 2
for (i in 1:rows) {
for (j in 1:cols) {
cat("i =", i, ", j =", j, "\n")
}
}出力:
i = 1 , j = 1
i = 1 , j = 2
i = 2 , j = 1
i = 2 , j = 2
i = 3 , j = 1
i = 3 , j = 2iの各値について、内側のループはjのすべての値を順に処理します。iが1のとき、jは1から2まで進みます。その後、iが2になり、jは再び1から2まで処理を始めます。rowsとcolsは変化しません。これらはループをいつ停止するかを示すだけです。
実用的な例として、簡単な九九のパターンを作成してみましょう。
for (row in 1:3) {
for (col in 1:3) {
cat(row * col, " ")
}
cat("\n")
}出力:
1 2 3
2 4 6
3 6 9外側のループは行を制御し、内側のループはその行の各列を処理します。各行の処理が完了したら、改行を出力して次の行に移ります。
チャレンジ
簡単入力から2つの数値、rows と cols を読み取ります。
入れ子のループを使って、各セルにその行番号と列番号の合計が入った数値の長方形を出力します。行番号は1からrowsまで、列番号は1からcolsまでです。
各行をそれぞれ別の行に出力し、値は1つのスペースで区切ります。出力にはcat()を使い、各行の後に改行を追加します。
たとえば、入力が3と4の場合、出力は次のようになります。
2 3 4 5
3 4 5 6
4 5 6 71行目(row 1)の値は1+1=2、1+2=3、1+3=4、1+4=5です。2行目(row 2)の値は2+1=3、2+2=4、2+3=5、2+4=6となり、以下同様です。
cat()は渡した値の間にスペースを入れるため、cat(row + col, "")は数値の後にちょうど1つのスペースを出力します。
各ループで新しいカウンターを使い(たとえば、行にはrow、行内の数値にはcol)、それをrowsまたはcolsと比較します。rowsとcols自体は変更しないでください。各行でcolsを再び使う必要があります。
自分で試してみよう
# 入力を読み取る
con <- file("stdin", "r")
rows <- as.integer(suppressWarnings(readLines(con, n = 1)))
cols <- as.integer(suppressWarnings(readLines(con, n = 1)))
close(con)
# TODO: 以下にコードを書く
# ネストしたループを使って、各セルに行番号 + 列番号を表示する長方形を出力する
# cat() を使って値をスペースで区切って出力し、各行の後に改行するこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: Rオンラインコンパイラ