3.8 制御文

 制御文はプログラムの流れをコントロールするためのもので大抵の言語で予約語になっています。制御文には条件分岐と繰り返し(ループ)の二種類があります。

 

3.8.1 条件分岐

 条件分岐には以下のようなものがあります。その他、パッケージなどで条件分岐のための関数が提供されています。

文・関数 説明
if else 基本的な条件分岐(予約語)
switch 条件が多数に分岐する場合に便利(予約語)
ifelse ExcelのIF関数に似た条件分岐(関数)

 

3.8.2 if, else

 if 文と else 文は最も基本的な条件分岐です。評価式には論理演算子または論理型変数を用います。コーディングスタイルとして以下のどちらも可能です。

x <- FALSE

if (x != TRUE) print("TRUE") else print("FALSE")
## [1] "TRUE"
if (x == TRUE) {
  print("TRUE")
} else {
  print("FALSE")
}
## [1] "FALSE"

 if 文は入れ子にしたり else if 文として組み合わせて使うことも可能です。

x <- 10L
y <- 5

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文と同じで評価式はTRUEFALSEが単一で返るようにしなければなりません。注意しなければならないのは、引数により構文が異なる点です。
 

3.8.3.1 引数が整数の場合

 引数に整数 \(n\) を指定した場合、\(n\) 番目の処理文の結果が返ります。

x <- 2
switch(x,                 # 分岐のための引数
       "x is 1",          # 1番目の処理文
       "x is 2",          # 2番目の処理文
       "Error")           # 3番目の処理文
## [1] "x is 2"

 注意しなければならないのは条件分岐数と一致しない場合は NULL が返される点です。

x <- 5L
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 文に相当する分岐が途中になっていても正しく処理してくれる点です。

x <- "2"
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"

 
 引数に整数を指定しても動作しますが、引数が整数の場合と同様の動きをします。

x <- 3
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 文と異なるのはベクトル型の評価が一度に行える点です。第一引数に TRUEFALSE が返る評価式であればベクトル型でも構いません。

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文については、あまり使うこともないと思いますので省略します。