.. include:: weblinks.txt .. _objects: 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. .. warning:: 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 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") .. admonition:: Question A l'aide de la table ASCII, essayer de prédire le contenu de ``x``. Utiliser la console R pour vérifier. .. result : > x [1] 28 41 .. warning:: Un vecteur vide a tout de même un ``mode``. .. code-block:: r > y <- numeric(0) > mode(y) [1] "numeric" > length(y) [1] 0 Comme on le verra dans le chapitre :ref:`dataframes`, 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 :ref:`functions`. 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 :func:`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 :func:`length`:: > length(bordeaux) [1] 8 Les autres attributs d'un objet sont données par la fonction :func:`attributes`. 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 .. admonition:: Question Essayer de prédire les valeurs de ``a`` aux indices 11, 12, 13 et 14. Utiliser la console R pour vérifier. .. result : les valeurs manquantes sont ``NA`` 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 > Accès aux attributs ------------------- La fonction :func:`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. 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 :func:`summary`.