12 Kreiranje i rad s listama

Nalik vektorima, liste su jednodimenzionalni objekti, ali mogu sadržavati elemente različitih tipova i mogu uključivati druge objekte (vektore, matrice, druge liste, funkcije i dr., što znači da elementi unutar liste ne moraju biti jednodimenzionalni). Zadaje se funkcijom list(). Na primjer,

lista1 <-list(5, "Pula", a, AB)
lista1
## [[1]]
## [1] 5
## 
## [[2]]
## [1] "Pula"
## 
## [[3]]
## [1] 1 2 3 4 5
## 
## [[4]]
##      [,1] [,2] [,3]
## [1,]   10   13   16
## [2,]   11   14   17
## [3,]   12   15   18
## [4,]    1    2    3
## [5,]    4    5    6
## [6,]    7    8    9

Elementi liste naznačeni su dvostrukim uglatim zagradama i označavaju poziciju elementa u listi. Dakle, i dalje se radi o uređenom nizu i prema poziciji je moguće odabirati elemente.

lista1[[2]]
## [1] "Pula"

12.1 Dodavanje atributa

Elementima liste moguće je pridružiti nazive.

names(lista1)<-c("broj", "grad", "vektor", "matrica")
lista1
## $broj
## [1] 5
## 
## $grad
## [1] "Pula"
## 
## $vektor
## [1] 1 2 3 4 5
## 
## $matrica
##      [,1] [,2] [,3]
## [1,]   10   13   16
## [2,]   11   14   17
## [3,]   12   15   18
## [4,]    1    2    3
## [5,]    4    5    6
## [6,]    7    8    9

Elementima liste moguće je pridodati nazive i prilikom kreiranja liste.

lista2<-list(Drzava="Hrvatska", Grad="Hvar", Selo="Heki", Rijeka="Hudinja", Jezero="Harambašić", Opcina="Hum na Sutli", Planina="Hahlići", Zivotinja=c("Hrcak", "Hobotnica", "Hijena"))
lista2
## $Drzava
## [1] "Hrvatska"
## 
## $Grad
## [1] "Hvar"
## 
## $Selo
## [1] "Heki"
## 
## $Rijeka
## [1] "Hudinja"
## 
## $Jezero
## [1] "Harambašić"
## 
## $Opcina
## [1] "Hum na Sutli"
## 
## $Planina
## [1] "Hahlići"
## 
## $Zivotinja
## [1] "Hrcak"     "Hobotnica" "Hijena"

12.2 Odabir elemenata

Odabire je moguće vršiti putem pozicije elementa i putem naziva.

lista2[1]
## $Drzava
## [1] "Hrvatska"
lista2$Drzava
## [1] "Hrvatska"
lista1$matrica
##      [,1] [,2] [,3]
## [1,]   10   13   16
## [2,]   11   14   17
## [3,]   12   15   18
## [4,]    1    2    3
## [5,]    4    5    6
## [6,]    7    8    9

Moguće je odabirati elemente unutar elemenata liste, na primjer:

lista1$matrica[4,3]
## [1] 3
lista1[[3]][15]
## [1] NA

12.3 Dodavanje elemenata

Ako se želi postojeću listu proširiti za element, onda je to moguće učiniti pridruživanjem.

lista2$Biljka<-"Hren"
lista2
## $Drzava
## [1] "Hrvatska"
## 
## $Grad
## [1] "Hvar"
## 
## $Selo
## [1] "Heki"
## 
## $Rijeka
## [1] "Hudinja"
## 
## $Jezero
## [1] "Harambašić"
## 
## $Opcina
## [1] "Hum na Sutli"
## 
## $Planina
## [1] "Hahlići"
## 
## $Zivotinja
## [1] "Hrcak"     "Hobotnica" "Hijena"   
## 
## $Biljka
## [1] "Hren"

Također, moguće je dodati element u neki od elemenata liste.

lista2$Biljka[2]<-"Hibiskus"
lista2
## $Drzava
## [1] "Hrvatska"
## 
## $Grad
## [1] "Hvar"
## 
## $Selo
## [1] "Heki"
## 
## $Rijeka
## [1] "Hudinja"
## 
## $Jezero
## [1] "Harambašić"
## 
## $Opcina
## [1] "Hum na Sutli"
## 
## $Planina
## [1] "Hahlići"
## 
## $Zivotinja
## [1] "Hrcak"     "Hobotnica" "Hijena"   
## 
## $Biljka
## [1] "Hren"     "Hibiskus"

Ako element koji se pridružuje nije potrebno imenovati, onda se pridruživanje može izvršiti na sljedeći način:

lista1[5]<-"50 %"
lista1
## $broj
## [1] 5
## 
## $grad
## [1] "Pula"
## 
## $vektor
## [1] 1 2 3 4 5
## 
## $matrica
##      [,1] [,2] [,3]
## [1,]   10   13   16
## [2,]   11   14   17
## [3,]   12   15   18
## [4,]    1    2    3
## [5,]    4    5    6
## [6,]    7    8    9
## 
## [[5]]
## [1] "50 %"

12.4 Izmjena ili brisanje elementa

Ako se želi izbrisati element, onda je to moguće na sljedeći način:

lista1[[1]]<-NULL
lista1
## $grad
## [1] "Pula"
## 
## $vektor
## [1] 1 2 3 4 5
## 
## $matrica
##      [,1] [,2] [,3]
## [1,]   10   13   16
## [2,]   11   14   17
## [3,]   12   15   18
## [4,]    1    2    3
## [5,]    4    5    6
## [6,]    7    8    9
## 
## [[4]]
## [1] "50 %"

Izmjena elementa:

lista1[[2]]<-c(6,7,8,9,10)
lista1
## $grad
## [1] "Pula"
## 
## $vektor
## [1]  6  7  8  9 10
## 
## $matrica
##      [,1] [,2] [,3]
## [1,]   10   13   16
## [2,]   11   14   17
## [3,]   12   15   18
## [4,]    1    2    3
## [5,]    4    5    6
## [6,]    7    8    9
## 
## [[4]]
## [1] "50 %"

12.5 Spajanje lista

Nadalje, slično kao što se mogu spajati vektori i matrice, mogu se spajati i liste.

lista3<-list(lista1,lista2)
lista3
## [[1]]
## [[1]]$grad
## [1] "Pula"
## 
## [[1]]$vektor
## [1]  6  7  8  9 10
## 
## [[1]]$matrica
##      [,1] [,2] [,3]
## [1,]   10   13   16
## [2,]   11   14   17
## [3,]   12   15   18
## [4,]    1    2    3
## [5,]    4    5    6
## [6,]    7    8    9
## 
## [[1]][[4]]
## [1] "50 %"
## 
## 
## [[2]]
## [[2]]$Drzava
## [1] "Hrvatska"
## 
## [[2]]$Grad
## [1] "Hvar"
## 
## [[2]]$Selo
## [1] "Heki"
## 
## [[2]]$Rijeka
## [1] "Hudinja"
## 
## [[2]]$Jezero
## [1] "Harambašić"
## 
## [[2]]$Opcina
## [1] "Hum na Sutli"
## 
## [[2]]$Planina
## [1] "Hahlići"
## 
## [[2]]$Zivotinja
## [1] "Hrcak"     "Hobotnica" "Hijena"   
## 
## [[2]]$Biljka
## [1] "Hren"     "Hibiskus"

Alternativno, liste se mogu spojiti i kombiniranjem:

lista4<-c(lista1,lista2)
lista4
## $grad
## [1] "Pula"
## 
## $vektor
## [1]  6  7  8  9 10
## 
## $matrica
##      [,1] [,2] [,3]
## [1,]   10   13   16
## [2,]   11   14   17
## [3,]   12   15   18
## [4,]    1    2    3
## [5,]    4    5    6
## [6,]    7    8    9
## 
## [[4]]
## [1] "50 %"
## 
## $Drzava
## [1] "Hrvatska"
## 
## $Grad
## [1] "Hvar"
## 
## $Selo
## [1] "Heki"
## 
## $Rijeka
## [1] "Hudinja"
## 
## $Jezero
## [1] "Harambašić"
## 
## $Opcina
## [1] "Hum na Sutli"
## 
## $Planina
## [1] "Hahlići"
## 
## $Zivotinja
## [1] "Hrcak"     "Hobotnica" "Hijena"   
## 
## $Biljka
## [1] "Hren"     "Hibiskus"

12.6 Razdvajanje lista

Razdvajanje liste vrši se pomoću unlist().

unlist(lista4)
##           grad        vektor1        vektor2        vektor3        vektor4 
##         "Pula"            "6"            "7"            "8"            "9" 
##        vektor5       matrica1       matrica2       matrica3       matrica4 
##           "10"           "10"           "11"           "12"            "1" 
##       matrica5       matrica6       matrica7       matrica8       matrica9 
##            "4"            "7"           "13"           "14"           "15" 
##      matrica10      matrica11      matrica12      matrica13      matrica14 
##            "2"            "5"            "8"           "16"           "17" 
##      matrica15      matrica16      matrica17      matrica18                
##           "18"            "3"            "6"            "9"         "50 %" 
##         Drzava           Grad           Selo         Rijeka         Jezero 
##     "Hrvatska"         "Hvar"         "Heki"      "Hudinja"   "Harambašić" 
##         Opcina        Planina     Zivotinja1     Zivotinja2     Zivotinja3 
## "Hum na Sutli"      "Hahlići"        "Hrcak"    "Hobotnica"       "Hijena" 
##        Biljka1        Biljka2 
##         "Hren"     "Hibiskus"

Funkcija unlist() pretvara listu u vektor, pa je moguće uočiti da su svi elementi matrice zasebno odvojeni. Isprobajte primjenu unlist() na lista3 i usporedite rezultate.

Ako su listi već pridodani atributi (nazivi), oni se mogu provjeriti/ ispisati ponoću attributes() ili attr().

attributes(lista2)
## $names
## [1] "Drzava"    "Grad"      "Selo"      "Rijeka"    "Jezero"    "Opcina"   
## [7] "Planina"   "Zivotinja" "Biljka"
attr(lista1, "names")
## [1] "grad"    "vektor"  "matrica" ""

12.7 Prednosti i nedostaci rada s listama te najčešće greške

Uobičajene greške pri radu s listama

  • Neispravan pristup elementima: greške u pristupu elementima liste mogu se dogoditi ako se koriste jednostruke uglate zagrade ([ ]) umjesto dvostrukih ([[ ]]) za pristup elementima liste. Jednostruke zagrade vraćaju podlistu, dok dvostruke vraćaju stvarni element.

  • Zaboravljanje heterogenosti podataka: budući da liste mogu sadržavati različite tipove podataka, korisnici ponekad zaborave na ovu činjenicu pri manipulaciji ili analizi podataka unutar liste, što može dovesti do neočekivanih rezultata ili grešaka.

  • Zadavanje (nepotrebno) složene strukture podataka: Ponekad korisnici nepotrebno kompliciraju strukturu podataka koristeći liste kada bi jednostavnija struktura podataka, kao što je vektor ili matrica, bila adekvatnija i efikasnija za određeni zadatak.

Prednosti korištenja lista

  • Fleksibilnost: liste u R-u mogu sadržavati elemente različitih tipova, uključujući brojeve, znakove, vektore, matrice, pa čak i druge liste. Ova fleksibilnost omogućava korisnicima da u jednom objektu pohrane kompleksne skupove podataka.

  • Strukturiranje složenih podataka: Liste su idealne za organiziranje složenih i hijerarhijskih podataka. Primjerice, možete imati listu koja sadrži podatke o različitim geografskim regijama, gdje svaki element liste predstavlja određenu regiju s vlastitom podlistom podataka relevantnih za tu regiju.

  • Spremanje funkcija i njihovih rezultata: Liste se mogu koristiti za spremanje niza funkcija ili čak rezultata izvršenja funkcija, što omogućava jednostavan pristup i analizu tih podataka kasnije.

Kad koristiti liste

  • Za rad s heterogenim podacima: liste su idealan izbor kada trebate raditi s nizom objekta različitih tipova podataka koje trebate držati zajedno.

  • Za složene strukture podataka: ako vaši podaci imaju složenu ili hijerarhijsku strukturu, liste omogućuju efikasno grupiranje i organizaciju tih podataka.

  • Kada funkcije vraćaju više od jednog rezultata: liste su korisne za spremanje rezultata funkcija koje vraćaju više od jednog objekta, omogućavajući vam da pohranite sve rezultate zajedno i pristupate im po potrebi.