R の IF、ELSE、ELSE IF ステートメント
⚡ スマートサマリー
R言語のif-else文とelse-if文は、論理条件に基づいてどのコードブロックを実行するかを選択します。このチュートリアルでは、2分岐形式、複数分岐チェーン、ベクトル化されたifelse()関数、および完全一致のためのswitch()関数について説明します。

R言語のif-else文
An 他の場合 このステートメントは、条件が真の場合に1つのコードブロックを実行し、偽の場合に別のコードブロックを実行します。R言語での構文は次のとおりです。
if (condition) { Expr1 } else { Expr2 }
quantityという名前の変数が20より大きいかどうかを確認します。20より大きい場合は「たくさん売れました!」と表示し、そうでない場合は「今日は足りません」と表示します。
# Create vector quantity quantity <- 25 # Set the if-else statement if (quantity > 20) { print('You sold a lot!') } else { print('Not enough for today') }
出力:
## [1] "You sold a lot!"
お願いインデントはRによるコードの実行方法には影響しませんが、一貫したインデントによって、長い条件式の連鎖が読みやすくなります。また、閉じ括弧とelseキーワードは同じ行に配置する必要があります。そうでない場合、Rはifブロックが完了済みとみなしてエラーを発生させます。
R言語のelse if文
連鎖的なさらなるテスト そうでなければRにはelifキーワードはありません。 PythonRでは、2つの単語を別々に記述し、必要なだけ分岐を追加できます。構文は次のとおりです。
if (condition1) { expr1 } else if (condition2) { expr2 } else if (condition3) { expr3 } else { expr4 }
3つの結果が欲しいとします。20未満の場合は「今日は十分ではありません」と印刷し、20~30の場合は「平均的な日」と印刷し、30以上の場合は「素晴らしい日でした!」と印刷します。
数量を変更してみてください。
# Create the variable quantity quantity <- 10 # Create multiple condition statement if (quantity < 20) { print('Not enough for today') } else if (quantity >= 20 & quantity <= 30) { print('Average day') } else { print('What a great day!') }
出力:
## [1] "Not enough for today"
例2:
付加価値税率は製品カテゴリーによって異なります。例えば、3つのカテゴリーがあり、それぞれに独自の税率が設定されているとします。
| カテゴリー | 製品 | 付加価値税(VAT) |
|---|---|---|
| A | 本、雑誌、新聞など。 | 8% |
| B | 野菜、肉、飲み物など。 | 10% |
| C | Tシャツ、ジーンズ、パンツなど。 | 20% |
else if文の連鎖によって、顧客が購入した商品に適切な料金が適用されます。
category <- 'A' price <- 10 if (category =='A'){ cat('A vat rate of 8% is applied.','The total price is',price *1.08) } else if (category =='B'){ cat('A vat rate of 10% is applied.','The total price is',price *1.10) } else { cat('A vat rate of 20% is applied.','The total price is',price *1.20) }
出力:
## A vat rate of 8% is applied. The total price is 10.8
R言語におけるifelse()ベクトル化関数
if文は、常に1つの値のみを処理します。ベクトルを指定すると、R 4.2以降ではエラーが発生します。これは、条件が単一のTRUEまたはFALSEでなければならないためです。ifelse()関数は、すべての要素を一度にテストし、同じ長さのベクトルを返すことでこの問題を解決します。
quantities <- c(10, 25, 40, 18) # if cannot do this result <- ifelse(quantities > 20, 'You sold a lot!', 'Not enough for today') result
出力:
## [1] "Not enough for today" "You sold a lot!" "You sold a lot!" ## [4] "Not enough for today"
引数は、テスト、テストがTRUEの場合に返される値、テストがFALSEの場合に返される値の3つです。これら3つはすべて同じ長さに再利用されます。
ifelse() をネストすると、ベクトル全体にわたって else if の連鎖が再現されます。
ifelse(quantities < 20, 'Not enough for today', ifelse(quantities <= 30, 'Average day', 'What a great day!'))
知っておくべき2つの制限があります。ifelse() は、結果から因子レベルや日付クラスなどの属性を削除し、すべての要素に対して両方の分岐を評価するため、一方の分岐のコストが高い場合は無駄になります。dplyr の代替手段 case_when() ネストを完全に回避し、型をそのまま維持します。
library(dplyr) case_when( quantities < 20 ~ 'Not enough for today', quantities <= 30 ~ 'Average day', TRUE ~ 'What a great day!' )
R言語のswitch()文
すべての分岐で同じ変数の等価性をテストする場合、長いelse if文の連鎖は読みにくくなります。switch()関数はそれを単一のルックアップに置き換えます。
category <- 'A' price <- 10 vat <- switch(category, 'A' = 1.08, 'B' = 1.10, 'C' = 1.20, 1.20) # the unnamed last value is the default cat('The total price is', price * vat)
その動作は3つのルールによって規定される。
- 文字引数の場合、switch() 関数は名前と完全に一致します。部分一致やパターン一致はできません。
- 名前のない最後の要素はデフォルト値として機能します。これがない場合、一致しない値は目に見えない形でNULLを返します。これは、サイレントバグの一般的な原因となります。
- 整数引数の場合、switch() は位置によって選択します。switch(2, “a”, “b”, “c”) は “b” を返します。
固定された値のセットに対して完全一致させるには switch() を使用し、switch() では表現できない範囲や複合条件には else if を使用します。シーケンスに対して条件を繰り返し適用するには、条件を次の条件と組み合わせます。 forループ または whileループ.
論理的 OperaR条件におけるtors
条件を構成する演算子はそれぞれ異なる動作をし、その違いは重要である。
| Operator | 意味 | でそれを使用してください |
|---|---|---|
| & | 要素ごとに、かつ | ifelse()、filter()、ベクトル全体 |
| && | 単一値AND、短絡 | if () and while () |
| | | 要素ごとのOR | ifelse()、filter()、ベクトル全体 |
| || | 単一値OR、短絡 | if () and while () |
| ! | 否定、テストを否定する | どこでも |
| %で% | このセットに値が含まれていますか? | 長いORチェーンを置き換える |
短絡が重要な理由。 二重形式は答えが確定するとすぐに停止するため、左辺で結果が既に決定されている場合は右辺が評価されることはありません。そのため、ガード句を記述しても安全です。
# Safe: length() is checked before x[1] is touched if (length(x) > 0 && x[1] > 10) print('ok')
複数の値と比較する。 等価性テストを連鎖させるよりも、%in% を使用する方が、より短く、入力ミスも少なくなります。
if (category %in% c('A', 'B')) { print('Reduced VAT rate applies') }
最後に一つ注意点があります。等号は値を代入するだけで、比較は行いません。条件式の中には必ず「==」を使用してください。
R言語における条件文:クイックリファレンス
このチュートリアルで使用されるすべての構成要素は以下のとおりです。
| DevOps Tools Engineer試験のObjective | Code |
|---|---|
| 2つの枝 |
if (cond) { a } else { b } |
| 複数の支店 |
if (c1) { a } else if (c2) { b } else { c } |
| ベクトル化された条件 |
ifelse(test, yes, no)
|
| ベクトル上のマルチブランチ |
case_when(c1 ~ a, c2 ~ b, TRUE ~ c)
|
| 完全一致検索 |
switch(x, "A" = 1, "B" = 2, 0) |
| 会員資格テスト |
if (x %in% c("A", "B")) { } |

