A switch() függvény tömör alternatívája lehet egy hosszú if ... else if vizsgálatsorozatnak.
A switch()-nek átadott változó leggyakrabban string, és ilyenkor az idézőjeleket el lehet hagyni a választóbó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 csúsznak át a következőre, ha az érték üresen marad, ahogy az M is a fenti példában.
Nem kell break utasításokat használni, mint néhány más nyelvben.
Amikor character típusra váltunk, az utolsó érték lesz az alapértelmezett, mint itt is.
Egész típusoknál nem adható meg alapértelmezett érték.
dplyr-benA base R switch-e meglehetősen korlátozott: csak egyetlen bemenetre tud pontos egyezést végezni.
Ez ésszerűnek tűnt, amikor az R 1993-ban megjelent, de a modern használathoz fejlesztésre szorul.
Ahogy a Conditionals fogalomban említettük, 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 dplyr csomagot úgy hozhatod be, ha a kódod elejére írod a library(dplyr) (az egyes csomaghoz) vagy a library(tidyverse) (a teljes gyűjteményhez) utasítást.
A dplyr csomag két további függvényt kínál a switch-hez kapcsolódóan.
recode_values és replace_values függvényekEz a két rokon függvény vektorizált, switch-szerű leképezést tesz lehetővé a régi értékekről az új értékekre.
A fő különbség közöttük az, hogy a recode_values() 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:
~) jellel kapcsolódnak össze = helyett.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
case_when függvényA case_when továbbfejleszti a case_match szintaxist: bármilyen logikai kifejezés állhat a ~ bal oldalán.
A bemeneti vektort (a lenti példában x-et) nem argumentumként kell megadni, 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.
Ebben a feladatban egy Blackjack-játék első körét szimuláljuk.
Két lapot kapsz, és látni fogod az osztó képpel felfelé álló lapját. Minden lapot egy-egy string jelöl, például „ace”, „king”, „three”, „two” és így tovább. Az egyes lapok értékei a következők:
| lap | érték | lap | érték |
|---|---|---|---|
| ace | 11 | eight | 8 |
| two | 2 | nine | 9 |
| three | 3 | ten | 10 |
| four | 4 | jack | 10 |
| five | 5 | queen | 10 |
| six | 6 | king | 10 |
| seven | 7 | other | 0 |
Megjegyzés: Az ászok általában 1 vagy 11 értéket is felvehetnek, de az egyszerűség kedvéért feltesszük, hogy csak a 11-es értéket vehetik fel.
Attól függően, hogy milyen két lapod van, és mi van az osztónál, a játék első körére létezik egy stratégia, amelyben a következő lehetőségeid vannak:
Bár még nem optimális, te azt a stratégiát követed, amelyet a barátod, Alex fejlesztett ki, és amely a következő:
Valósíts meg egy parse_card függvényt, amely kiszámítja egy lap számértékét:
parse_card("ace")
# => 11
Írj egy first_turn függvényt, amely a fent leírt döntési logikát valósítja meg:
first_turn(card1, card2, dealer_card)
Íme néhány példa a várható eredményekre:
first_turn("ace", "ace", "jack") == "P"
first_turn("ace", "king", "ace") == "S"
first_turn("five", "queen", "ace") == "H"
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) R nyelvet 21 fogalom111 feladat segítségével, valódi emberi mentorálással, mindez ingyen.