Indice
Liste
Una lista è un elenco indicizzato di oggetti, che possono essere di tipi e classi diverse, e che possono includere anche altre liste. Ricordiamo che:
- I dataframe sono liste di vettori (organizzate in righe e colonne, quindi oggetti misti);
- Molti risultati di funzioni sono organizzati in forma di lista;
- Alcuni argomenti delle funzioni vanno inseriti come liste.
Costruire una lista
Per costruire una lista usiamo la funzione list()
:
vettore1 <- c(1, 5, 8, 9, 3) # creazione di una lista lista <- list(vettore1, 5, "pippo") lista
## [[1]] ## [1] 1 5 8 9 3 ## ## [[2]] ## [1] 5 ## ## [[3]] ## [1] "pippo"
Nomi degli elementi (names)
Gli elementi di una lista (come quelli di un vettore) possono avere un nome:
# creazione di una lista con nomi altralista <- list("numeric" = 5, "char" = "pluto") altralista
## $numeric ## [1] 5 ## ## $char ## [1] "pluto"
Come si vede, ciascun elemento è indicato dal nome preceduto dal simbolo $
. Poiché i dataframe sono liste di vettori (variabili, in colonna), le variabili di un dataframe vengono indicate in questo modo.
Possiamo visualizzare, assegnare o modificare i nomi degli elementi con names()
:
names(altralista)
## [1] "numeric" "char"
names(lista)
## NULL
# assegnare i nomi agli elementi di una lista names(lista) <- c("vettore", "numero", "stringa") names(lista)
## [1] "vettore" "numero" "stringa"
names(lista)[[2]]
## [1] "numero"
# attribuire / cambiare nome a un elemento della lista names(lista)[[2]] <- "num" names(lista)[[2]]
## [1] "num"
Nested lists
Una lista può far parte di un'altra lista. In questo caso, però, sarà altralista a far parte di lista ...
# nested list lista$altralista <- altralista lista
## $vettore ## [1] 1 5 8 9 3 ## ## $num ## [1] 5 ## ## $stringa ## [1] "pippo" ## ## $altralista ## $altralista$numeric ## [1] 5 ## ## $altralista$char ## [1] "pluto"
Indicizzazione delle liste
Vedi: Indicizzazione
Gli oggetti inclusi in una lista, come quelli inclusi in un vettore, hanno un indice (sono indicizzati) in base alla posizione che occupano.
Indicando un elemento con le parentesi quadre semplici ([]
), otteniamo come risultato un sottoinsieme della lista (subset):
lista[1]
## $vettore ## [1] 1 5 8 9 3
Si tratta ancora di una lista:
str(lista[1])
## List of 1 ## $ vettore: num [1:5] 1 5 8 9 3
Con le doppie parentesi quadre ([[]]
), estraiamo i singoli valori che compongono il primo elemento della lista, ovvero il vettore numerico:
lista[[1]]
## [1] 1 5 8 9 3
str(lista[[1]])
## num [1:5] 1 5 8 9 3
Per accedere a un sottoelemento della lista:
lista$vettore[2]
## [1] 5
In questo caso, la differenza fra []
e [[]]
non risulta evidente:
class(lista$vettore[2])
## [1] "numeric"
class(lista$vettore[[2]])
## [1] "numeric"
In caso di liste nested, come altralista, e come molte di quelle incontrate in questo testo, ovviamente la differenza si ripete.
class(lista$altralista[2])
## [1] "list"
class(lista$altralista[[2]])
Infine, se hanno un nome, elementi e sottoelementi possono essere richiamati con quello:
lista$vettore
## [1] 1 5 8 9 3
lista$altralista$char
## [1] "pluto"
La notazione $
è equivalente a [[]]
:
class(lista$altralista$char)
## [1] "character"
Script di esempio
- Liste.R
vettore1 <- c(1, 5, 8, 9, 3) # creazione di una lista lista <- list(vettore1, 5, "pippo") # creazione di una lista con nomi altralista <- list("numeric" = 5, "char" = "pluto") # assegnare i nomi agli elementi di una lista names(lista) <- c("vettore", "numero", "stringa") # attribuire / cambiare nome a un elemento della lista names(lista)[[2]] <- "num" # nested list lista$altralista <- altralista