> langage et graphiques > Arrays listes et dataframes > Listes
Listes
Une liste est un tableau ordonné d'éléments qui peuvent être hétérogènes, contrairement à un vecteur. Les éléments d'une liste peuvent eux-mêmes être des listes. Les listes sont le moyen de construire des structures de données arbitrairement complexes.
Construction d'une liste :
- lis <- list(firstname = "jean", lastname = "dupond", age = 35, childAges = c(3, 5, 9)).
- Accès aux noms des éléments de la liste : names(lis). On peut aussi modifier les noms des éléments en faisant une affectation : names(lis) <- c("f", "l", "a", "c")
- lis <- list(c("a", "b"), 5, c(3, 2)) : création d'une liste sans nommer les éléments.
- length(lis) : longueur de la liste (ici 4).
- list() : liste vide.
Quand on construit une liste à partir d'objets, ceux-ci sont recopiés (objet original différent !) :
La liste n'est pas modifiée quand on modifie le premier élément de vect :
vect <- c(2, 3); lis <- list(a = vect, b = c("a")); vect[1] <- 7; lis
$a
[1] 2 3
$b
[1] "a"
Accès aux éléments de la liste :
- lis$firstname : par nom.
- lis$first : par début de nom (il suffit qu'il n'y ait pas ambiguité !)
- lis[["firstname"]] : par nom indirectement (utile si le nom est contenu dans une variable : name <- "firstname"; lis[[name]]). Le nom abrégé ne marche pas ici.
- Si on veut tester l'existence d'un nom, utiliser : match("firstname", names(lis)).
- lis[[1]] : accès par index (origine à 1). Attention : lis[1] renvoie une liste composée d'un seul élément, le premier !
Boucler sur les éléments d'une liste :
for (element in lis) {
print(element)
}
Les liste peuvent être utilisées comme des hashs, mais attention au problèmes des débuts de clefs (d'où la nécessité de pouvoir tester l'existence d'une clef).
Concaténation de listes :
- c(lis1, lis2) : donne une liste composée des éléments de lis1 et des éléments de lis2 (pas une liste de liste).
- list(lis1, lis2) : donne une liste de listes, de premier élément lis1 et de deuxième élément lis2 (en général, ce n'est pas ce que l'on veut, sauf si on veut construire des arbres).
- Pour rajouter un élément à une liste : c(lis1, list(element)). Ne pas faire c(lis1, c(10, 20)), mais c(lis1, list(c(10, 20))) pour avoir le résultat voulu !
Conversion liste/vecteur :
Teste si un objet est une liste : is.list(obj) renvoie TRUE si obj est une liste, FALSE sinon.
Reclassement d'une liste :
si
lis <- list(a = c(1, 2), b = c(3, 4), c = c(5, 6)), on peut réordonner la liste :
- avec les indices : lis[c(3, 1, 2)]
- avec les noms : lis[c("c", "a", "b")]
Définition dynamique d'une liste de liste :
- Attention, ne pas faire : l <- list(); l[["a"]][["b"]] <- 7 : ca ne crée pas une liste de liste comme on pourrait le penser.
- Faire : l <- list(); l[["a"]] <- list(); l[["a"]][["b"]] <- 7.
Application d'une fonction aux éléments d'une liste :
Si
lis <- list(a = c(2, 3, 4), b = c(5, 6, 7), c = c(8, 9)) :
- lapply(lis, mean) fournit une liste dont chaque élément est la moyenne de chaque élément de lis.
- sapply(lis, mean) : pareil, sauf que le résultat est simplement un vecteur.
Copyright Aymeric Duclert
programmer en R, tutoriel R, graphes en R