Listes avec une classe
Fait partie de la section Programmation orientée objet du Journey R de Coddy. Leçon 2 sur 57.
S3 est le système d’objets le plus ancien et le plus utilisé de R. Un objet S3 est une liste ordinaire avec un attribut class, une étiquette qui indique de quel type d’objet il s’agit. class(x) <- "dog" définit l’étiquette :
rex <- list(name = "Rex", age = 3)
class(rex) <- "dog"
print(class(rex))
cat(rex$name, "is", rex$age)Sortie :
[1] "dog"
Rex is 3structure() construit la valeur et définit ses attributs en un seul appel, ce qui est la manière habituelle de créer un objet S3. Les champs sont lus avec $ comme dans toute liste :
rex <- structure(list(name = "Rex", age = 3), class = "dog")
print(class(rex))
print(is.list(rex))
print(rex$age)Résultat :
[1] "dog"
[1] TRUE
[1] 3La classe n’est qu’une étiquette : R ne vérifie pas les champs que possède un objet, donc n’importe quelle liste peut être appelée dog. unclass() supprime l’étiquette et restitue la liste ordinaire :
p <- structure(list(x = 1, y = 2), class = "point")
print(unclass(p))Sortie :
$x
[1] 1
$y
[1] 2Les objets S3 sont des valeurs. Une fonction qui modifie un objet modifie sa propre copie ; elle renvoie donc la nouvelle version et l’appelant l’assigne. L’original reste tel quel :
birthday <- function(d) {
d$age <- d$age + 1
d
}
rex <- structure(list(name = "Rex", age = 3), class = "dog")
older <- birthday(rex)
cat(rex$age, older$age)Sortie :
3 4Défi
FacileComplétez make_pet(name, species, age) dans Pet.R. Cette fonction renvoie une liste contenant les champs name, species et age, dans cet ordre, ainsi que la classe pet. Complétez ensuite describe_pet(p), qui renvoie une phrase : un animal nommé Rex, de l’espèce dog et âgé de 3 ans donne Rex is a 3 year old dog.
Le code fourni lit le nom, l’espèce et l’âge, crée l’animal, puis affiche sa classe, les noms de ses champs et la phrase.
Votre code doit être placé dans Pet.R. main.R contient le code fourni pour les entrées et les sorties et ne peut pas être modifié.
Essayez vous-même
source("Pet.R")
# Code d'entrée/sortie fourni : le garder tel quel
input <- suppressWarnings(readLines(file("stdin")))
p <- make_pet(input[1], input[2], as.numeric(input[3]))
cat("class: ", class(p), "\n", sep = "")
cat("fields: ", paste(names(p), collapse = ", "), "\n", sep = "")
cat(describe_pet(p), "\n", sep = "")
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation orientée objet
1Bases de S3
Travailler avec les fichiersListes avec une classeFonctions constructricesMéthodes print et formatValidateurs et fonctions utilitairesRécapitulatif - Températures4Encapsulation dans R
Les fermetures comme objetsLes environnements comme objetsFonctions d’accèsProtéger l’étatRécapitulatif - Parcmètre2S3 : génériques et méthodes
Génériques et UseMethodMéthodes par défautMéthodes pour les génériques de baseNotions de base sur NextMethodRécapitulatif - Aires des formes5Classes S4
Définir des classes S4Slots et accèsVérifications de validitéMéthodes showRécapitulatif - Catalogue de produits8Classes de référence
Définition des classes de référenceMéthodes et mises à jour des champsSémantique de copieHéritage et callSuperRécapitulatif - File d’attente des tâches11Projet : gestion de bibliothèque
Livres et membresEmprunter des livres3Héritage S3
Vecteurs de classesOrdre de recherche des méthodesÉtendre avec NextMethodVérifier avec inherits()Récapitulatif - Paie du personnelEntraînez-vous par vous-même : Compilateur R en ligne