List

Lors de l’épisode précédent, nous avons donné des noms aux lignes et aux colonnes d’une matrice M de dimension [12, 3] en écrivant :

dimnames(M) <- list(month.abb, 2001:2003)

Chose promise, chose due : nous allons maintenant étudier les objets de classe list.

Puisque nous y sommes, exécutez ça :

Names <- list(month.abb, 2001:2003)

Dans la console :

> Names
[[1]]
 [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"

[[2]]
[1] 2001 2002 2003

Et :

> class(Names)
[1] "list"

Dans R, les listes sont des objets fourre-tout dans lesquels on peut ranger à peu près n’importe quoi.

Par exemple, avec :

aire <- function(r) pi * r^2
x <- matrix(1, 3, 3)

On peut construire une liste contenant un vecteur de texte, un vecteur numérique, une fonction et une matrice (en rajoutant des noms au passage) :

X <- list( mois = month.abb,
           annees = 2001:2003,
           fun = aire,
           mat = x)

(Comme d’habitude, les espaces, les retours à la ligne et les indentations sont purement esthétiques.)

Ce qui nous donne :

> X
$mois
 [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"

$annees
[1] 2001 2002 2003

$fun
function (r) 
pi * r^2

$mat
     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    1    1    1
[3,]    1    1    1

Par ailleurs :

> length(X)
[1] 4
> names(X)
[1] "mois"   "annees" "fun"    "mat"

Comme pour les vecteurs et les matrices, on peut accéder aux différents éléments d’une liste par leur position :

> X[[2]]
[1] 2001 2002 2003

Notez bien les doubles [[indice]] parce que :

> X[[2]]
[1] 2001 2002 2003
> test <- X[[2]]
> class(test)
[1] "integer"

Mais :

> test <- X[2]
> class(test)
[1] "list"
> test
$annees
[1] 2001 2002 2003

Avec un simple [indice], vous récupérez une liste (ici de longueur 1).

C’est ce qui nous permet de faire :

> X[1:2]
$mois
 [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"

$annees
[1] 2001 2002 2003

En revanche, donc, pour accéder aux éléments de la liste, vous utiliserez cette syntaxe :

> X[[4]]
     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    1    1    1
[3,]    1    1    1

Vous pouvez aussi indexer par les noms de cette manière :

> X[["mois"]]
 [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"

Ou de cette manière :

> X$mois
 [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"

Vous pouvez manipuler les éléments d’une liste :

> paste(X$mois[1:3], collapse = "")
[1] "JanFebMar"
> rev(X$annees)
[1] 2003 2002 2001
> X$fun(10)
[1] 314.1593
> colSums(X$mat)
[1] 3 3 3

Dans certaines conditions, vous pouvez aussi unlister une liste :

> x <- list(1:3, 4:6)
> unlist(x)
[1] 1 2 3 4 5 6

Notez à ce propos que :

> x <- list(1:3, matrix(1:9, 3, 3))
> unlist(x)
 [1] 1 2 3 1 2 3 4 5 6 7 8 9

Oh ! Mais qui voilà ?

> mois
Erreur : objet 'mois' introuvable
> attach(X)
> mois
 [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"
> detach(X)
> mois
Erreur : objet 'mois' introuvable

Je vous laisse là-dessus...

Aucun commentaire:

Enregistrer un commentaire