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().