Les séquences : listes
Algo & Prog avec R
A. Malapert, B. Martin, M. Pelleau, et J.-P. Roy 2 décembre 2021
Université Côte d’Azur, CNRS, I3S, France firstname.lastname@univ-cotedazur.fr
Qu’est-ce qu’une séquence ?
Séquence
Une séquence est une suite finie de valeurs numérotées, distinctes ou pas, de n’importe quel type.
Vecteur
Un vecteur est une séquence d’éléments du même type.
> 1:6
[1] 1 2 3 4 5 6
> c(’ foo ’, ’ bar ’) [1] " foo " " bar "
Liste
Une liste est une séquence d’éléments de type quelconque.
> l i s t(1:6 , c(’ foo ’, ’ bar ’) ) [ [ 1 ] ]
[1] 1 2 3 4 5 6 [ [ 2 ] ]
[1] " foo " " bar "
Mutabilité
Les listes et vecteurs sont mutables, i.e. on peut les modifier.
1/9
De l’utilité des listes . . .
Comment représenter n points de R
2?
On numérote les points qui appartiendront en fait à F
2. Liste avec 2 vecteurs de taille n (Version I)
I Le vecteur x contient les abscisses des points.
I Le vecteur y contient les ordonnées des points.
Un carré tourné à 45 degrés
> li < - l i s t(c(-1 , 0 , 1 , 0) , c(0 , -1 , 0 , 1) )
Liste de n vecteurs de taille 2 (Version II)
Chaque vecteur contient l’abscisse et l’ordonnée d’un point.
Un carré tourné à 45 degrés
> li < - l i s t(c(-1 , 0) , c(0 , -1) , c(1 , 0) , c(0 , 1) )
Les listes sont partout !
Les structures de données à plusieurs dimensions sont souvent des listes
décorées.
2/9Accès par rang aux éléments d’une liste
Attention aux différences entre vecteurs et listes I La notation indexée par double crochets.
I Les indices commencent à 1.
I R renvoie une erreur quand les indices sont négatifs.
I L’accès par rang devient différent de l’extraction par tranches.
> li < - l i s t(c(-1 , 0) , c(0 , -1) , c(1 , 0) , c(0 , 1) )
> li [ [ 2 ] ] # r e n v o i e un v e c t e u r !
[1] 0 -1
> li [[-2]]
E r r o r in li [[-2]] :
a t t e m p t to s e l e c t m o r e t h a n one e l e m e n t in g e t 1 i n d e x < r e a l
>
> li [[2:3]]
E r r o r in li [[2:3]] : i n d i c e h o r s l i m i t e s
3/9
Construction d’une nouvelle liste
Construction en extension On utilise surtout la fonction list.
> li < - l i s t(42 , " foo ", TRUE , 1:10)
Concaténation de deux séquences
On peut coller côte à côte (concaténer) deux séquences.
> li1 < - l i s t( 4 2 )
> li2 < - l i s t(" foo ")
Concaténation
> a p p e n d( li1 , li2 ) [ [ 1 ] ]
[1] 42 [ [ 2 ] ] [1] " foo "
Création d’une liste de listes
> l i s t( li1 , li2 ) # cr é a t i o n d ’ u n e l i s t e de l i s t e s [ [ 1 ] ]
[ [ 1 ] ] [ [ 1 ] ] [1] 42 [ [ 2 ] ] [ [ 2 ] ] [ [ 1 ] ]
[1] " foo " 4/9
Extraction d’une tranche d’une liste
La notation des tranches (slices) est valide pour toute séquence.
I Comme pour les vecteurs, on utilise les crochets simples.
I Le résultat est une liste.
> li < - l i s t(c(-1 , 0) , c(0 , -1) , c(1 , 0) , c(0 , 1) )
Vecteur numérique d’indices Avec duplication.
> li [c(1 ,3 ,3) ] [ [ 1 ] ]
[1] -1 0
[ [ 2 ] ] [1] 1 0 [ [ 3 ] ] [1] 1 0
Vecteur logique d’indices Avec recyclage.
> li [c( TRUE , F A L S E ) ] [ [ 1 ] ]
[1] -1 0
[ [ 2 ] ] [1] 1 0
Comme pour les vecteurs, on peut utiliser les fonctions d’extraction head
et tail.
5/9Autres opérations sur les listes
Modification d’une liste
Avec l’opérateur crochet, la méthode append ou les indices négatifs.
> li < - l i s t(c(-1 , 0) , c(0 , -1) , c(1 , 0) , c(0 , 1) )
> li [c(-1 , -3 , -4) ] # s u p p r e s s i o n d ’ é l é m e n t s [ [ 1 ] ]
[1] 0 -1
Arithmétique, conditions et tests vectorisés ?
Non, on procédera d’autres manières, par exemple par itérations.
> li + li
E r r o r in li + li : a r g u m e n t non num é r i q u e p o u r un op é r a t e u r b i n a i r e
> li = = li
E r r o r in li = = li : c o m p a r a i s o n de ces t y p e s non i m p l é m e n t é e
> li & li
E r r o r in li & li :
ces op é r a t i o n s ne s o n t p o s s i b l e s que p o u r des t y p e s num é riques , l o g i q u e s ou c o m p l e x e s
6/9
Boîte englobante pour un nuage de points
Comment représenter n points de R
2?
On numérote les points qui appartiendront en fait à F
2. 1. Liste avec 2 vecteurs de taille n.
I
Le vecteur
xcontient les abscisses points.
I
Le vecteur
ycontient les ordonnées des points.
2. Liste de taille n dont chaque élément est un vecteur de taille 2.
I
Chaque vecteur contient l’abscisse et l’ordonnée d’un point.
Figure 1 –
Qu’est-ce qu’une boîte englobante ? Merci
Wikipedia. 7/9Boîte englobante (Version I)
C a l c u l e r B o i t e E n g l o b a n t e < - f u n c t i o n( pts ) {
# # p t s e s t u n e l i s t e a v e c 2 v e c t e u r s r e t u r n(l i s t(
r a n g e( pts [ [ 1 ] ] ) , r a n g e( pts [ [ 2 ] ] ) ) )
}
> pts < - l i s t(c(-1 , 0 , 1 , 0) , c(0 , -1 , 0 , 1) )
> C a l c u l e r B o i t e E n g l o b a n t e ( pts ) [ [ 1 ] ]
[1] -1 1
[ [ 2 ] ]
[1] -1 1
8/9
Boîte englobante (Version II)
C a l c u l e r B o i t e E n g l o b a n t e < - f u n c t i o n( pts ) {
# # p t s e s t u n e l i s t e de n v e c t e u r s
C a l c u l e r I n t e r v a l l e E n g l o b a n t < - f u n c t i o n( pts , d ) {
# # on r e p r o g r a m m e la f o n c t i o n r a n g e . . . a < - Inf
b < - -Inf f o r( p in pts ) {
i f( p [ d ] < a ) a < - p [ d ] i f( p [ d ] > b ) b < - p [ d ] }
r e t u r n(c( a , b ) ) }
x < - C a l c u l e r I n t e r v a l l e E n g l o b a n t ( pts , 1) y < - C a l c u l e r I n t e r v a l l e E n g l o b a n t ( pts , 2)
# # on m e t en f o r m e le r é s u l t a t r e t u r n(l i s t( x , y ) )
}
9/9
Questions?
Retrouvez ce cours sur le site web www.i3s.unice.fr/~malapert/R
9/9