Kurzusok
/
R
R
/
Tanterv
/
Listák
Li

Listák ebben a kurzusban: R

1 feladat

A(z) Listák fogalomról

Az R-ben egy list elemek rendezett gyűjteménye, amely néhány szempontból különbözik a vectors-tól:

  • Az elemek különböző típusúak lehetnek (pl. numeric keverése character-rel).
  • Az elemek összetett szerkezetek lehetnek (pl. vektorok, más listák stb.).
  • Az elemek eléréséhez némileg más szintaxis tartozik.

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ő.

Listák létrehozása

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"

A listaelemek elérése

Háromféleképpen teheted meg, és mindegyik más helyzetben hasznos.

1. $tag jelöléssel

Nagyon 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"

2. [[tag]] jelöléssel

Ennek 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

3. Pozíció szerinti indexszel

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"

Elemek hozzáadása és törlése

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 listák „rekurzív vektorok”

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.

Még néhány szó a listák indexeléséről

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. Vedd ki az első elemet a [[1]] segítségével.
  2. Használd az 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.

Advanced

Belső reprezentáció

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.

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

Tanuld meg a(z) Listák fogalmat