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ó).
dplyr-benA 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.
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.
recode_values és a replace_values függvényEz 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:
= helyett egy tilde (~) jellel kapcsolod össze.NA értékekre külön is illeszthetsz (erről a Nothingness fogalomban lesz szó).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
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.
case_when függvényA 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"