Tracks
/
R
R
/
Lehrplan
/
Switch
Sw

Switch in R

1 Übung

Über Switch

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).

Funktionen in 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.

Note

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.

Die Funktionen 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:

  • Die Optionen auf der linken Seite können Vektoren sein, und die Eingabe passt, wenn irgendein Element passt.
  • Optionen links und Ergebnisse rechts werden mit einer Tilde ~ statt mit = verknüpft.
  • Fehlende Werte NA können explizit abgeglichen werden (das besprechen wir im Nichts-Konzept).
  • Ein Standardwert kann in allen Fällen angegeben werden.
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
Note

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.

Die Funktion 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"
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab

Lerne Switch