7. Les objets de R
La notion d’objet en R est très différente de celle qu’on utilise classiquement avec les langages informatiques lorsqu’on parle de programmation orientée objet. Un objet R est en fait une structure de données pouvant posséder des attributs, enrichissant les données.
Avertissement
La notion d’attribut en R est assez différentes de celle utilisée pour les langages orientés objet. Il s’agit plutôt d’informations additionnelles.
Un exemple d’attribut observé précédemment est l’attribut names
qui permet d’associer un nom à une valeur d’un vecteur en plus de l’index. La conséquence est de faciliter l’exploitation des données par une plus grande lisibilité du code et des résultats obtenus.
Par exemple, les valeurs du recensement (l’attribut names
est affiché sur la ligne précédant les valeurs):
> bordeaux
1962 1968 1975 1982 1990 1999 2007 2012
278403 266662 223131 208159 210336 215363 235178 241287
Les données de recensement sont explicites car l’attribut names
du vecteur bordeaux
est renseigné:
> names(bordeaux)
[1] "1962" "1968" "1975" "1982" "1990" "1999" "2007" "2012"
Si on le retire, l’accès à l’information est plus difficile:
> names(bordeaux) <- NULL
> bordeaux
[1] 278403 266662 223131 208159 210336 215363 235178 241287
7.1. Les attributs intrinsèques: mode
et length
Un vecteur est une structure dite atomique car tous les élément qu’il contient sont de même nature :
numérique (entier ou réél) ;
complexe ;
logique ;
chaîne de caractères.
Le type est appelé le mode
. Comme on l’a vu précédemment, même si un vecteur est homogène, il peut contenir la valeur spéciale NA
.
Pour être complet, il existe un autre type de vecteur, utilisé pour représenter des données binaires, le type raw
:
> x <- raw(2)
> mode(x)
[1] "raw"
Par défaut, la déclaration d’un vecteur effectue simultanément son initialisation avec la valeur NULL
identifiée par 00
conformément à la table ASCII:
> x
[1] 00 00
Une fois le vecteur créé, on peut affecter des valeurs à ses éléments:
> x[1] <- as.raw(40) # NB, not just 40.
> x[2] <- charToRaw("A")
Question
A l’aide de la table ASCII, essayer de prédire le contenu de x
. Utiliser la console R pour vérifier.
Avertissement
Un vecteur vide a tout de même un mode
.
> y <- numeric(0)
> mode(y)
[1] "numeric"
> length(y)
[1] 0
Comme on le verra dans le chapitre Data frames, R manipule également des objets de type list
(non atomiques). Une list
est une séquence ordonnée d’objets pouvant être de mode différent. Une list
est une structure récursive puisqu’elle peut elle même contenir d’autres list
.
Les fonctions sont également des objets pouvant être récursifs, ce qu’on verra dans le chapitre Les fonctions.
Le mode
d’un objet est une propriété élémentaire de cet objet. C’est ce qu’on entend par attribut de base. La fonction mode()
est utilisée pour connaitre sa valeur.
Un autre attribut de base est sa longueur que l’on récupère avec la fonction length()
:
> length(bordeaux)
[1] 8
Les autres attributs d’un objet sont données par la fonction attributes()
.
7.2. Modifier la longueur d’un objet
La longueur initiale de l’objet est définie à sa création:
> a <- 1:9
> length(a)
[1] 9
> a
[1] 1 2 3 4 5 6 7 8 9
On peut modifier dynamiquement le contenu de l’objet au cours de sa vie:
> a[10] <- 10
> length(a)
[1] 10
> a
[1] 1 2 3 4 5 6 7 8 9 10
Les valeurs ne sont pas nécessairement contigües:
> a[15] <- 15
> length(a)
[1] 15
Question
Essayer de prédire les valeurs de a
aux indices 11, 12, 13 et 14. Utiliser la console R pour vérifier.
Si on peut modifier dynamiquement le contenu de l’objet au cours de sa vie, on peut également modifier ses attributs intrinsèques.
On a déjà modifié le mode par coercition avec les fonctions de la famille as.xxxx()
mais on peut également le faire explicitement:
> mode(a) <- "character"
> a
[1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" NA NA NA NA
[15] "15"
Il en est de même pour l’attribut length
:
> b <- 1:20
> b
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
> length(b) <- 5
> b
[1] 1 2 3 4 5
>
7.3. Accès aux attributs
La fonction attributes()
retourne une liste de tous les attributs non intrinsèques de l’objet
La fonction attr(object, name)
est utilisé pour définir un attribut particulier. Elle est peu employée mais on est capable de définir par exemple une date de création.
7.4. La class
d’un objet
La class
d’un objet est utilisée pour définir le comportement d’une fonction générique lorsque cet objet est passé en argument.
Pour un vecteur, la class
et le mode
sont presque toujours identiques:
> obj <- c(1,2,3)
> mode(obj)
[1] "numeric"
> class(obj)
[1] "numeric"
> obj <- c(1.0,2.0,3.0)
> mode(obj)
[1] "numeric"
> class(obj)
[1] "numeric"
> obj <- c("1", "2", "3")
> mode(obj)
[1] "character"
> class(obj)
[1] "character"
> obj <- c(TRUE, TRUE, FALSE)
> mode(obj)
[1] "logical"
> class(obj)
[1] "logical"
Pour des objets plus complexes, par exemple la data.frame
utilisée pour présenter les possibilités de R au début de ce cours, la class
conditionne l’affichage. Par exemple avec la fonction summary()
.