Az R-ben egy list elemek rendezett gyűjteménye, amely néhány szempontból különbözik a vectors-tól:
numeric keverése character-rel).A más nyelvekkel való párhuzamok pontatlanok.
Egy R-beli list némileg hasonlít a Python szótárára, de a list rendezett, és numerikus indexszel érhető el.
Némileg hasonlít a C struct-jához is, azzal a különbséggel, hogy a list futásidőben könnyen bővíthető.
Az elemek nevekkel való ellátása (amit gyakran „tagnek” neveznek) a listáknál gyakoribb, mint a vektoroknál:
list(x = 5.3, y = 4.2, color = "blue")
#> $x
#> [1] 5.3
#> $y
#> [1] 4.2
#> $color
#> [1] "blue"
A tagek azonban nem kötelezőek, ilyenkor az R egyszerűen indexszámokat használ:
list(5.3, 4.2, "blue")
#> [[1]]
#> [1] 5.3
#> [[2]]
#> [1] 4.2
#> [[3]]
#> [1] "blue"
Háromféleképpen teheted meg, és mindegyik más helyzetben hasznos.
$tag jelölésselNagyon gyakori, ha a tagnevek előre ismertek.
point <- list(x = 5.3, y = 4.2, color = "blue")
#> point$x
#> [1] 5.3
#> point$color
#> [1] "blue"
[[tag]] jelölésselEnnek az az előnye, hogy a tagnév futásidőben választható meg. Figyeld meg a dupla zárójelet.
want <- "y"
point[[want]] # same as point$y
#> [1] 4.2
Ez akkor is működik, ha a listának vannak tagjei, és akkor is, ha nincsenek. A zárójelek itt is duplázódnak.
point[[3]] # same as point$color
#> [1] "blue"
Egyszerű: ha értéket rendelsz egy elemhez, az módosul, ha már létezik, vagy beszúródik, ha új.
point$color <- "red"
point$trust <- TRUE
# str() gives more compact output than the default display
str(point)
#> List of 4
#> $ x : num 5.3
#> $ y : num 4.2
#> $ color: chr "red"
#> $ trust: logi TRUE
Törléshez rendeld a NULL értéket a nem kívánt elemhez.
point$trust <- NULL
str(point)
#> List of 3
#> $ x : num 5.3
#> $ y : num 4.2
#> $ color: chr "red"
A vector osztályt technikailag atomic vector néven ismerik, mert csak atomi értékeket tárolhat: numeric, character, boolean stb.
Mivel egy list más listákat is tartalmazhat, recursive vector néven is ismert.
Ez nem csupán technikai elnevezésbeli kérdés, hanem arra is emlékeztet, hogy a listák szerkezete tetszőlegesen összetett lehet. A programozó felelőssége, hogy megértse, mi lesz az eredmény, amikor egy listaelemhez hozzáfér.
A fenti példák némelyike dupla zárójelet [[ ]] használt a listaelemek eléréséhez.
Ez megpróbálja az elemet a mögöttes típusára lapítani, ami akkor hasznos, ha csak egy számot vagy stringet szeretnél.
Az egyszeres zárójel [ ] használata nem végzi el ezt az összelapítást, és a visszaadott érték egy részlista lesz.
point[["color"]]
#> [1] "red" # flattened
point["color"]
#> $color
#> [1] "red" # sublist
Még ha a részlista nem is az, amire egy kezdő R-programozó valószínűleg számít, légy tudatában ennek.
A maximális rugalmasság érdekében számos szabványos R-függvény list-et ad vissza, még akkor is, ha az csak egyetlen atomi értéket tartalmaz, mint itt.
Vektorrá alakításhoz két lehetőség van.
[[1]] segítségével.unlist() függvényt.pt <-point["color"]
pt[[1]]
#> [1] "red" # simple 1-element vector
unlist(pt)
#> color
#> "red" # 1-element vector with name
Légy óvatos az unlist() függvénnyel.
A szerkezet összelapítása hasznos ebben az egyszerű esetben, de meglepő eredményeket okozhat összetettebb listaelemeknél.
Egy list az atomi vector-höz hasonlóan folytonosan tárolódik. A különbség az, hogy a numerikus és boolean vektorok értékeket tárolnak, a lista viszont hivatkozásokat tárol a memória máshol található objektumaira.
Ennek ismerete ritkán fontos egy R-felhasználónak, de egy olyan többnyelvű közösségben, mint az Exercism, hasznos lehet a más nyelveket ismerő programozóknak.