IF, ELSE, ELSE IF-Anweisung in R
⚡ Intelligente Zusammenfassung
In R bestimmen If-Else- und Else-If-Anweisungen anhand einer logischen Bedingung, welcher Codeblock ausgeführt wird. Diese Anleitung behandelt die Zwei-Zweig-Form, Verzweigungsketten, die vektorisierte ifelse()-Funktion und switch() für exakte Übereinstimmungen.

Die if-else-Anweisung in R
An wenn sonst Die Anweisung führt einen Codeblock aus, wenn eine Bedingung WAHR ist, und einen anderen, wenn sie FALSCH ist. In R lautet die Syntax:
if (condition) { Expr1 } else { Expr2 }
Prüfe, ob eine Variable namens quantity größer als 20 ist. Wenn ja, gibt der Code „Du hast viel verkauft!“ aus, andernfalls „Nicht genug für heute“.
# Create vector quantity quantity <- 25 # Set the if-else statement if (quantity > 20) { print('You sold a lot!') } else { print('Not enough for today') }
Ausgang:
## [1] "You sold a lot!"
HinweisDie Einrückung hat keinen Einfluss darauf, wie R den Code ausführt, aber eine einheitliche Einrückung sorgt dafür, dass lange Bedingungsketten lesbar bleiben. Beachten Sie außerdem, dass die schließende geschweifte Klammer und das Schlüsselwort `else` in derselben Zeile stehen müssen, da R den `if`-Block sonst als abgeschlossen betrachtet und einen Fehler ausgibt.
Die else if-Anweisung in R
Ketten Sie weitere Tests mit Sonst wennR kennt kein elif-Schlüsselwort, das heißt PythonIn R schreibt man die beiden Wörter getrennt, und man kann beliebig viele Zweige hinzufügen. Die Syntax lautet:
if (condition1) { expr1 } else if (condition2) { expr2 } else if (condition3) { expr3 } else { expr4 }
Angenommen, Sie möchten drei Ergebnisse erzielen: bei weniger als 20 Drucken „Nicht genug für heute“, bei 20 bis 30 Drucken „Durchschnittlicher Tag“ und bei mehr als 30 Drucken „Was für ein toller Tag!“.
Sie können versuchen, die Menge zu ändern.
# 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!') }
Ausgang:
## [1] "Not enough for today"
Beispiel 2:
Die Mehrwertsteuersätze unterscheiden sich je nach Produktkategorie. Stellen Sie sich drei Kategorien vor, jede mit ihrem eigenen Steuersatz:
| Kategorien | Produkte | MwSt |
|---|---|---|
| A | Buch, Zeitschrift, Zeitung usw. | 8% |
| B | Gemüse, Fleisch, Getränke usw. | 10% |
| C | T-Shirt, Jeans, Hose usw. | 20% |
Eine Else-Wenn-Kette wendet den korrekten Kurs auf das an, was der Kunde gekauft hat:
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) }
Ausgang:
## A vat rate of 8% is applied. The total price is 10.8
Die ifelse()-Vektorfunktion in R
Die if-Anweisung verarbeitet genau einen Wert. Übergibt man ihr einen Vektor, führt dies in R 4.2 oder höher zu einem Fehler, da die Bedingung entweder TRUE oder FALSE sein muss. ifelse() löst dieses Problem, indem es jedes Element einzeln prüft und einen Vektor gleicher Länge zurückgibt.
quantities <- c(10, 25, 40, 18) # if cannot do this result <- ifelse(quantities > 20, 'You sold a lot!', 'Not enough for today') result
Ausgang:
## [1] "Not enough for today" "You sold a lot!" "You sold a lot!" ## [4] "Not enough for today"
Die drei Argumente sind der Test, der Rückgabewert, wenn der Test WAHR ist, und der Rückgabewert, wenn er FALSCH ist. Alle drei werden auf dieselbe Länge wiederholt.
Verschachtelte ifelse()-Anweisungen erzeugen eine else if-Kette über einen gesamten Vektor:
ifelse(quantities < 20, 'Not enough for today', ifelse(quantities <= 30, 'Average day', 'What a great day!'))
Zwei Einschränkungen sind zu beachten. `ifelse()` entfernt Attribute wie Faktorstufen und die Datumsklasse aus dem Ergebnis und wertet beide Zweige für jedes Element aus, was ineffizient ist, wenn ein Zweig aufwändig ist. Die dplyr-Alternative case_when() vermeidet die Verschachtelung vollständig und erhält die Typen bei:
library(dplyr) case_when( quantities < 20 ~ 'Not enough for today', quantities <= 30 ~ 'Average day', TRUE ~ 'What a great day!' )
Die switch()-Anweisung in R
Wenn jeder Zweig dieselbe Variable auf Gleichheit prüft, wird eine lange else if-Kette schwer lesbar. switch() ersetzt sie durch eine einzige Abfrage.
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)
Drei Regeln bestimmen sein Verhalten:
- Bei einem Zeichenargument gleicht switch() den Namen exakt ab. Es gibt keine Teilübereinstimmung und keine Mustererkennung.
- Ein unbenanntes letztes Element dient als Standardwert. Fehlt ein solches, wird bei nicht übereinstimmenden Werten unbemerkt NULL zurückgegeben, was eine häufige Ursache für unbemerkte Fehler ist.
- Bei einem ganzzahligen Argument wählt switch() stattdessen anhand der Position aus: switch(2, “a”, “b”, “c”) gibt “b” zurück.
Verwenden Sie `switch()` für exakte Übereinstimmungen mit einer festen Wertemenge und `else if` für Bereiche und zusammengesetzte Bedingungen, die mit `switch()` nicht ausgedrückt werden können. Um eine Bedingung wiederholt auf eine Sequenz anzuwenden, kombinieren Sie sie mit einem for-Schleife oder die while-Schleife.
logisch OperaTore in R-Bedingungen
Die Operatoren, die eine Bedingung erstellen, verhalten sich unterschiedlich, und dieser Unterschied ist wichtig.
| OperaDo. | Bedeutung | Verwenden Sie es in |
|---|---|---|
| & | Elementweise UND | ifelse(), filter(), ganze Vektoren |
| && | Einfachwertiges UND, Kurzschlüsse | if () and while () |
| | | Elementweise ODER | ifelse(), filter(), ganze Vektoren |
| || | Einfachwert-ODER, Kurzschlüsse | if () and while () |
| ! | NICHT, negiert den Test | Anywhere |
| %In% | Ist der Wert in dieser Menge enthalten? | Ersetzt lange OR-Ketten |
Warum Kurzschlüsse wichtig sind. Die doppelte Form stoppt, sobald die Antwort feststeht, sodass die rechte Seite nie ausgewertet wird, wenn die linke Seite das Ergebnis bereits bestimmt hat. Dadurch ist es unbedenklich, eine Schutzklausel zu schreiben:
# Safe: length() is checked before x[1] is touched if (length(x) > 0 && x[1] > 10) print('ok')
Vergleich mit mehreren Werten. Verwenden Sie %in% anstatt verkettete Gleichheitstests, da dies kürzer und weniger fehleranfällig ist:
if (category %in% c('A', 'B')) { print('Reduced VAT rate applies') }
Noch ein letzter Hinweis: Ein einzelnes Gleichheitszeichen weist einen Wert zu, es vergleicht ihn nicht. Schreiben Sie immer == innerhalb einer Bedingung.
Bedingte Anweisungen in R: Kurzübersicht
Alle in diesem Tutorial verwendeten Konstrukte sind unten aufgeführt:
| Ziel | Code |
|---|---|
| Zwei Zweige |
if (cond) { a } else { b } |
| Mehrere Filialen |
if (c1) { a } else if (c2) { b } else { c } |
| Vektorisierter Zustand |
ifelse(test, yes, no)
|
| Mehrfachverzweigung eines Vektors |
case_when(c1 ~ a, c2 ~ b, TRUE ~ c)
|
| Suche nach exakter Übereinstimmung |
switch(x, "A" = 1, "B" = 2, 0) |
| Mitgliedschaftstest |
if (x %in% c("A", "B")) { } |

