3.8 制御文
制御文はプログラムの流れをコントロールするためのもので大抵の言語で予約語になっています。制御文には条件分岐と繰り返し(ループ)の二種類があります。
3.8.1 条件分岐
条件分岐には以下のようなものがあります。その他、パッケージなどで条件分岐のための関数が提供されています。
文・関数 | 説明 |
---|---|
if else |
基本的な条件分岐(予約語) |
switch |
条件が多数に分岐する場合に便利(予約語) |
ifelse |
ExcelのIF関数に似た条件分岐(関数) |
3.8.2 if, else
if
文と else
文は最も基本的な条件分岐です。評価式には論理演算子または論理型変数を用います。コーディングスタイルとして以下のどちらも可能です。
<- FALSE
x
if (x != TRUE) print("TRUE") else print("FALSE")
## [1] "TRUE"
if (x == TRUE) {
print("TRUE")
else {
} print("FALSE")
}
## [1] "FALSE"
if
文は入れ子にしたり else if
文として組み合わせて使うことも可能です。
<- 10L
x <- 5
y
if ((x > 5) && (y < x)) {
print("match, (x > 5) && (y < x)")
else if ((x > 5) && (y >= x)) {
} print("match, (x > 5) && (y >= x)")
else {
} print("else")
}
## [1] "match, (x > 5) && (y < x)"
3.8.3 switch
分岐する条件の数が多い場合はif
文でなくswitch
*文を利用するのが便利です。if
文と同じで評価式はTRUE
かFALSE
が単一で返るようにしなければなりません。注意しなければならないのは、引数により構文が異なる点です。
3.8.3.1 引数が整数の場合
引数に整数 \(n\) を指定した場合、\(n\) 番目の処理文の結果が返ります。
<- 2
x switch(x, # 分岐のための引数
"x is 1", # 1番目の処理文
"x is 2", # 2番目の処理文
"Error") # 3番目の処理文
## [1] "x is 2"
注意しなければならないのは条件分岐数と一致しない場合は NULL
が返される点です。
<- 5L
x is.null(switch(x, # 分岐のための引数
"x is 1", # 1番目の処理文
"x is 2", # 2番目の処理文
"Error")) # 3番目の処理文
## [1] TRUE
3.8.3.2 引数が文字の場合
一方、引数が文字の場合、if/else
文と同様の処理が行われます。if/else
文と異なるのは else
文に相当する分岐が途中になっていても正しく処理してくれる点です。
<- "2"
x switch(x,
"1" = "x is 1", # 引数が"1"と一致する場合(`if (x == "1")` に等価)
"x is others", # 一致するものがない場合(`else` に等価)
"2" = "x is 2") # 引数が"2"と一致する場合(`if (x == "2")` に等価)
## [1] "x is 2"
引数に整数を指定しても動作しますが、引数が整数の場合と同様の動きをします。
<- 3
x switch(x, # 分岐のための引数が整数になると
"1" = "x is 1", # 1番目の処理文
"x is others", # 2番目の処理文
"2" = "x is 2") # 3番目の処理文
## [1] "x is 2"
3.8.4 ifelse
base::ifelse
は予約語でなく関数です。if/else
文と異なるのはベクトル型の評価が一度に行える点です。第一引数に TRUE
か FALSE
が返る評価式であればベクトル型でも構いません。
ifelse(TRUE, 1, 0)
3.8.5 繰り返し
繰り返しは文字通り処理を任意の回数繰り返す場合に用いるもので予約語になっています。繰り返し文の処理は時間がかかるため R においては好ましくなく繰り返しは使わずベクトル演算で処理すべきと言われていますが、R-3.4.0 から JIT コンパイラと呼ばれる繰り返し処理の高速化がデフォルトで有効化されており今後は処理記述の流れが変わる可能性があります。処理の高速化についてはこちらの 参考資料 で確認してください。なお、繰り返し処理で注意すべき点は繰り返し文中では明示的に出力を指定しないと出力がなされない点です。
文 | 説明 |
---|---|
for |
条件式に与えたベクトルやリストが空になるまで任意の回数繰り返す |
while |
条件式に与えた条件が成立している限り繰り返す |
repeat |
無限に繰り返すが繰り返し処理中のbreak 文で繰り返しを終了できる |
また、繰り返しを条件式以外で変更する処理用の文として以下が用意されています。これらも予約語です。
文 | 説明 |
---|---|
next |
この文が実行された時点で強制的に次の繰り返し処理に入ります |
break |
この文が実行された時点で繰り返し処理を終了します |
3.8.6 for
for
文は最も基本となる繰り返し処理で、条件式としてベクトルやリストを指定できる点が他の言語と異なる点です。
for (i in c(1:5, 7, 9:15)) {
if (i == 4) {
next
else if (i >= 10) {
} break
else {
} print(as.character(i))
} }
## [1] "1"
## [1] "2"
## [1] "3"
## [1] "5"
## [1] "7"
## [1] "9"
3.8.7 while, repeat
while
文とrepeat
文については、あまり使うこともないと思いますので省略します。