Kurzusok
/
R
R
/
Tanterv
/
Elágazások
El

Elágazások ebben a kurzusban: R

2 feladat

A(z) Elágazások fogalomról

Összehasonlító operátorok

Az R operátorai ugyanazok, mint sok más nyelvben:

1 == 2 # FALSE
1 != 2 # TRUE
1 < 2 # TRUE
1 > 2 # FALSE
1 <= 2 # TRUE
1 >= 2 # FALSE

Elágazás

Az if-then-else alapformája a következő:

if (x > 10) {
    y <- "big"
} else if (x > 2) {
    y <- "medium"
} else {
    y <- "tiny"
}

Ebben az esetben a Boolean körüli zárójel (( )) és a törzs körüli kapcsos zárójel ({ }) is kötelező.

Az egyszerű if utasítás lerövidíthető:

if (x == 0) return("success")

Vektorok használata feltételes elágazásokban

Előretekintve a vector-filtering fogalomra: a zárójelben () lévő feltételnek egyetlen TRUE/FALSE értékre kell kiértékelődnie.

Ha vektorokat is bevonunk az összehasonlításba, az általában Boolean-ok vektorát adja, ezért ezeket egy összesítő függvénybe kell csomagolni, például az all() (minden érték igaz?) vagy az any() (legalább egy érték igaz?) függvénybe.

numbers <- c(4,5,7,9,10,11)
numbers %% 3 == 0 # gives vector of booleans
#> [1] FALSE FALSE FALSE  TRUE FALSE FALSE

# use any() to get a single TRUE/FALSE
if (any(numbers %% 3 == 0)) print("1 or more numbers are divisible by 3")
#> [1] "1 or more numbers are divisible by 3"

Az ifelse függvény

Egy alternatív if-else forma is hasznos lehet, feltéve, hogy csak igaz/hamis kimenet lehetséges.

y <- ifelse(x > 8, "big", "small")

# Don't mix result types:
z <- ifelse(x > 100, 100, "small") # numeric or string result? Expect problems!

Az ifelse() pontosan három paramétert vesz fel:

  1. Boolean-feltétel
  2. az érték, ha TRUE
  3. az érték, ha FALSE.

Vektoros bemenet is megengedett, ilyenkor a kimenet is vektor lesz. Ebben az esetben ügyelj arra, hogy mindkét ág ugyanolyan típusú adatot adjon: numerikus, karakter, logikai stb. Erről a vector-functions fogalomban lesz szó.

A két eredmény ("big", "small" a fenti példában) egy-egy érték legyen. Sajnos, ha itt hosszabb vektort adsz meg, az valószínűleg zavaró és váratlan eredményhez vezet, figyelmeztető üzenet nélkül.

Az if_else függvény

Háttér

Az R nyelv karbantartói igyekeznek a lehető legjobban elkerülni a visszafelé nem kompatibilis változtatásokat. Ez segít karbantartani a CRAN-ban elérhető rengeteg harmadik féltől származó csomagot, de korlátozza, hogy a base R-t modern programozási fogalmakkal frissítsék.

Az utóbbi években több csomag is megjelent, amelyek kiegészítik, sőt néha le is cserélik az R funkcióit; ezek az eredeti R-terv erősségeiről és gyengeségeiről szerzett több évtizedes tapasztalaton alapulnak.

Ezek a csomagok alkotják a tidyverse gyűjteményt. 2023-ban kerültek be az Exercism tesztfuttatójába, és a feladatokban szabadon használhatod őket.

Az R-kurzusunk több évvel a tidyverse megjelenése előtt született, ezért előfordulhat, hogy sok közösségi megoldás a base nyelvnél marad.

A dplyr csomag

A dplyr főleg dataframe-ek manipulálásáról szól (erről később lesz szó a kurzusban).

Add hozzá a library(dplyr) sorral a kódod elején, vagy a library(tidyverse) sorral, hogy az egész gyűjteményt betöltsd. Láthatsz figyelmeztetéseket maszkolt nevekről, de ez ritkán jelent problémát.

A mostani fogalom kapcsán érdemes megemlíteni az if_else függvényt. Nagyjából hasonló a base R-beli ifelse függvényhez.

library(dplyr) # warnings not shown

x <- 10
if_else(x > 8, "big", "small")
#> [1] "big"

A fő különbség, hogy az if_else fogadhat egy opcionális negyedik argumentumot a hiányzó értékekhez, amelyeket az R a NA értékkel jelöl.

xs <- c(3, NA, 10, NA, 4)  # a 5-element vector
xs
#> [1]  3 NA 10 NA  4
if_else(xs > 8, "big", "small", "missing")
#> [1] "small"   "missing" "big"     "missing" "small" 

# contrast:
ifelse(xs > 8, "big", "small")
#> [1] "small" NA      "big"   NA      "small"

Az is előfordulhat, hogy az if_else sokkal jobb hibaüzeneteket ad, mint a régebbi ifelse.

A dplyr csomag betöltése után a between() függvény is elérhető lesz a számodra.

Az R nem engedi az összehasonlítások láncolását, ezért az 1 <= x <= 5 hibát ad. Ha a dplyr be van töltve, a between(x, 1, 5) ugyanazt jelenti, mint az x >= 1 & x <= 5, és talán olvashatóbb is. Az alsó és a felső határ is beleértendő.

Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg

Tanuld meg a(z) Elágazások fogalmat