Sw

Switch ebben a kurzusban: R

1 feladat

A(z) Switch fogalomról

A switch() függvény tömör alternatívája lehet egy hosszú if ... else if vizsgálatsorozatnak. A váltás alapjául szolgáló változó leggyakrabban string, ilyenkor az idézőjeleket el is hagyhatod a szelektorból.

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"

Figyeld meg, hogy az opciók csak akkor esnek át a következőre, ha az értéket üresen hagyod, ahogy a fenti példában az M esetében. Nem kell break utasításokat írnod, mint néhány más nyelvben.

Az utolsó érték lehet alapértelmezett érték, mint itt, vagy egy stop(), amely hibát dob, ha a feltételek az összes esetet le akarják fedni. Kicsit más a helyzet, ha egész szám alapján váltunk: ilyenkor az alapértelmezett érték mindig NULL (erről a Nothingness fogalomban lesz szó).

Függvények a dplyr-ben

A switch a base R-ben meglehetősen korlátozott: csak egyetlen bemenetre tud pontos egyezést keresni. Ez ésszerűnek tűnt, amikor az R 1993-ban megjelent, de a modern használathoz fejlesztésre szorul.

Note

Ahogy a Conditionals fogalomban olvashattad, a tidyverse csomaggyűjtemény célja, hogy kiegészítse (és néha helyettesítse) a base R funkcionalitását anélkül, hogy a visszafelé kompatibilitást befolyásolná.

A tidyverse csomagjai emellett kiváló, modern dokumentációval rendelkeznek, így az alábbi linkekre kattintva több részletet is megtudhatsz.

A dplyr csomagot úgy veheted használatba, hogy a kódod elejére beírsz egy library(dplyr) (az adott csomaghoz) vagy library(tidyverse) (a teljes gyűjteményhez) sort.

A dplyr könyvtár két további függvényt kínál a switch-hez kapcsolódóan.

A recode_values és a replace_values függvény

Ez a két rokon függvény régi értékek új értékekre való, vektorizált, switch-szerű leképezését teszi lehetővé.

A fő különbség köztük az, hogy a recode_values() egy teljesen új vektort hoz létre, míg a replace_values() egy meglévő vektor részleges frissítését teszi lehetővé.

Az egyeztetés továbbra is pontos, de:

  • A bal oldali opciók vektorok is lehetnek, és a bemenet akkor egyezik, ha bármelyik elem egyezik.
  • A bal oldali opciókat és a jobb oldali eredményeket = helyett egy tilde (~) jellel kapcsolod össze.
  • A hiányzó NA értékekre külön is illeszthetsz (erről a Nothingness fogalomban lesz szó).
  • Minden esetben megadható alapértelmezett érték.
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

Találkozhatsz olyan netes tanácsokkal, hogy a case_match() függvényt használd vektorizált switch-ként.

Ez a függvény a dplyr 1.2.0-s verziójában (2026 februárjában) elavulttá vált. Ha most próbálod használni, figyelmeztető üzenetet kapsz, amely helyette a recode_values() használatát javasolja.

A case_when függvény

A case_when továbbviszi a case_match szintaxisát: a ~ bal oldalán bármilyen logikai kifejezés állhat.

A bemeneti vektort (a lenti példában x-et) nem argumentumként adod meg, csak már definiálva kell lennie.

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?"

A between() függvény szintén a dplyr része.

A stringfüggvényekről már volt szó, a reguláris kifejezések pedig egy későbbi fogalom témája lesz. Ezek kiválóan kombinálhatók a case_when-nel.

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"
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg

Tanuld meg a(z) Switch fogalmat