Ez egy nagy fogalom az R-ben. Hogy eligazodj a lehetőségek között, hasznos lehet megvizsgálni a különböző függvények bemenetének és kimenetének dimenziószámát.
Már láttunk olyan függvényeket, amelyek egy vektort kapnak, és egyetlen, skalárszerű értéket adnak vissza:
v <- 1:5
length(v)
#> [1] 5
sum(v)
#> [1] 15
Sok statisztikai függvény is ebbe a kategóriába tartozik, például a mean().
Logikai vektorokhoz ott van az all() és az any(), amelyek egyetlen TRUE vagy FALSE értéket adnak vissza.
Az R-ben számos függvény dolgozik teljes vektorokon, és gyakran vektort ad eredményül. Ide tartozik a matematikai függvények többsége:
sq <- c(4, 9, 16, 25)
sqrt(sq) # square root
#> [1] 2 3 4 5
Ez nem csupán tömör és kényelmes, hanem feleslegessé teszi a ciklusok, listakomprehenziók vagy rekurzió használatát is, amelyek más nyelvekben gyakoriak. Az R-ben a vektorfüggvények gyakran sokkal gyorsabbak, mint ezek a technikák.
Valószínűleg sokkal többször használtál már vektorizált függvényeket, mint gondolnád. Hasonlítsd össze ezeket:
v <- c(2, 7, 9)
w <- c(3, 1, 5)
v + w
#> [1] 5 8 14
"+"(v, w)
#> [1] 5 8 14
A jól ismert infix operátorok nem mások, mint a mögöttes vektorizált függvény szintaktikai cukorkái! Ebben az esetben a "+"().
Vektor rendezéséhez ott van a sort(), amely az értékeket adja vissza, és az order(), amely az indexeket:
v <- c("I", "am", "not", "in", "order")
sort(v)
#> [1] "am" "I" "in" "not" "order"
order(v)
#> [1] 2 1 4 3 5
Alapértelmezés szerint növekvő sorrendben rendez.
Ha szükséges, add meg a decreasing = TRUE beállítást, vagy használd a rev() függvényt egy meglévő vektor megfordításához.
v <- c("I", "am", "not", "in", "order")
sort(v, decreasing = TRUE)
#> [1] "order" "not" "in" "I" "am"
rev(1:4)
#> [1] 4 3 2 1
Vannak olyan függvények is, mint a cumsum() és a cumprod(), amelyek kumulatív vektorkimenetet állítanak elő, balról jobbra haladva a bemeneti vektoron:
cumsum(1:5)
#> [1] 1 3 6 10 15 # sums
cumprod(1:5)
#> [1] 1 2 6 24 120 # equivalent to factorials
A fenti példák hasonlítanak a foldl művelethez sok funkcionális nyelvben, azzal a különbséggel, hogy itt a kimenet egy vektor az összes köztes értékkel.
Ennek a fogalomnak a kiterjesztésével vektorokat is össze lehet hasonlítani.
Például vegyük a páronkénti maximumot kiszámító pmax() függvényt:
v
#> [1] 2 7 9
w
#> [1] 3 1 5
pmax(v, w)
#> [1] 3 7 9 # max of each pairwise comparison
Ez a függvény és a hozzá hasonlók is tetszőleges számú bemeneti vektort fogadnak el, nem csak kettőt.
A fenti példa azonos hosszúságú vektorokat használ. Ahogy a Vektorszűrés fogalomnál tárgyaltuk, az R recycling segítségével bővíti ki azokat a vektorokat, amelyek valahogyan „túl rövidek”. Ismételten: használd körültekintően, és lehetőleg csak olyan vektorral, amelynek hossza 1.
pmax(v, 5)
#> [1] 5 7 9
Ez ritkább, de meglehetősen könnyű olyan függvényeket írni, amelyek látszólag skalárt kapnak, és vektort adnak vissza.
Ha vektort adsz be nekik, a kimenet egy kétdimenziós matrix (erről egy későbbi fogalomban lesz szó).