Die Funktion switch() kann ein knapper Ersatz für eine lange Reihe von if ... else if-Tests sein.
Meistens ist die Variable, die an switch() übergeben wird, ein String, und dann kannst du die Anführungszeichen im Selektor weglassen.
star <- function(type) {
switch(type,
M = , # will "fall through" if no value given
K = "red dwarf",
G = "Earth-like",
"bigger star" # only correct for O,B,A,F
)
}
> star("M")
[1] "red dwarf"
Beachte, dass Optionen nur dann durchfallen, wenn der Wert leer bleibt, wie bei M im obigen Beispiel.
Anders als in manchen anderen Sprachen brauchst du keine break-Anweisungen einzufügen.
Der letzte Wert kann ein Standardwert sein, wie hier, oder ein stop(), um einen Fehler zu werfen, wenn mit den Bedingungen alle Fälle abgedeckt sein sollen.
Bei einer Ganzzahl ist es etwas anders: Hier ist der Standardwert immer NULL (darauf gehen wir im Konzept „Nichts" ein).
dplyr
Das switch in Base R ist recht eingeschränkt: Es führt nur einen exakten Abgleich mit einer einzelnen Eingabe durch.
Das schien vernünftig, als R 1993 zum ersten Mal veröffentlicht wurde, bedarf aber für die moderne Nutzung einer Verbesserung.
Wie im Konzept Conditionals erwähnt, ist die Paketsammlung tidyverse darauf ausgelegt, die Funktionalität von Base R zu ergänzen (und manchmal zu ersetzen), ohne die Abwärtskompatibilität zu beeinträchtigen.
Die tidyverse-Pakete haben außerdem eine hervorragende, moderne Dokumentation, die folgenden Links geben dir also mehr Details.
Du kannst das Paket dplyr in den Gültigkeitsbereich bringen, indem du entweder library(dplyr) (für das einzelne Paket) oder library(tidyverse) (für die ganze Sammlung) oben in deinen Code einfügst.
Die dplyr-Bibliothek bietet zwei zusätzliche Funktionen rund um switch.
recode_values und replace_values
Diese beiden verwandten Funktionen ermöglichen eine vektorisierte, switch-ähnliche Zuordnung alter Werte zu neuen Werten.
Der Hauptunterschied zwischen ihnen ist, dass recode_values() einen völlig neuen Vektor erstellt, während replace_values() partielle Aktualisierungen eines vorhandenen Vektors erlaubt.
Der Abgleich ist weiterhin exakt, aber:
~ statt mit = verknüpft.NA können explizit abgeglichen werden (das besprechen wir im Nichts-Konzept).library(dplyr)
x <- c("a", "b", "a", "d", "b", NA, "c", "e", "z")
recode_values(
x,
"a" ~ 1,
"b" ~ 2,
"c" ~ 3,
c("d", "e") ~ 4, # either "d' or "e" will match
NA ~ 0, # matches missing values
default = 100 # note the different syntax for the default
)
#> [1] 1 2 1 4 2 0 3 4 100
Vielleicht stößt du online auf den Rat, die Funktion case_match() als vektorisiertes switch zu verwenden.
Diese Funktion wurde in dplyr Version 1.2.0 (Februar 2026) als veraltet markiert.
Wenn du sie jetzt verwendest, erzeugt das eine Warnmeldung, die dir stattdessen recode_values() empfiehlt.
case_when
Die Funktion case_when führt die Syntax von case_match einen Schritt weiter, indem sie jeden logischen Ausdruck links von der ~ zulässt.
Der Eingabevektor (x im Beispiel unten) wird nicht als Argument übergeben, er muss nur bereits definiert sein.
x <- 1:10
case_when(
x < 3 ~ "low",
between(x, 3, 5) ~ "mid",
between(x, 6, 8) ~ "high",
.default = "what?"
)
#> [1] "low" "low" "mid" "mid" "mid" "high" "high" "high" "what?" "what?"
Die Funktion between() gehört ebenfalls zu dplyr.
Stringfunktionen haben wir bereits besprochen, und Reguläre Ausdrücke werden Thema eines späteren Konzepts sein.
Sie lassen sich sehr gut mit case_when kombinieren.
library(stringr)
tracks <- "R C Python C# Elixir C++ Odin" |> str_split_1(" ")
tracks
#> [1] "R" "C" "Python" "C#" "Elixir" "C++" "Odin"
case_when(
str_starts(tracks, "C") ~ "C-like",
str_starts(tracks, "[AEIOU]") ~ "vowel",
.default = "other"
)
#> [1] "other" "C-like" "other" "C-like" "vowel" "C-like" "vowel"