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
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")
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"
ifelse függvényEgy 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:
TRUE
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.
if_else függvényAz 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.
dplyr csomagA 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ő.