Méthodes pour les génériques de base
Fait partie de la section Programmation orientée objet du Journey R de Coddy. Leçon 9 sur 57.
De nombreuses fonctions de base de R sont des génériques S3 : print(), format(), summary(), toString(), length(), as.character() et bien d’autres. Ajouter une méthode permet à votre classe de fonctionner avec une fonction que tout utilisateur de R connaît déjà. summary.gradebook() fournit un rapport sur l’ensemble d’un objet :
summary.gradebook <- function(object, ...) {
paste0(length(object$marks), " marks, average ", mean(object$marks))
}
g <- structure(list(marks = c(70, 85, 91)), class = "gradebook")
cat(summary(g), "\n")Sortie :
3 marks, average 82 Vérifiez les paramètres du générique avant d’écrire la méthode : summary() appelle son premier argument object, tandis que toString() et format() l’appellent x. toString() doit renvoyer une seule chaîne :
toString.gradebook <- function(x, ...) paste(x$marks, collapse = " / ")
g <- structure(list(marks = c(70, 85, 91)), class = "gradebook")
print(toString(g))Sortie :
[1] "70 / 85 / 91"Une méthode length() modifie la signification de length() pour la classe. Une file d’attente qui stocke ses éléments dans un champ peut indiquer combien d’éléments elle contient, plutôt que le nombre de champs dans la liste :
q <- structure(list(items = c("a", "b", "c"), name = "jobs"), class = "queue")
print(length(q))
length.queue <- function(x) length(x$items)
print(length(q))Sortie :
[1] 2
[1] 3Les opérateurs sont eux aussi des génériques. Une méthode nommée "+.money", écrite entre guillemets à cause du symbole, s’exécute lorsque l’un ou l’autre côté de + est un objet money. Elle reçoit les deux côtés sous les noms e1 et e2 :
new_money <- function(amount) structure(list(amount = amount), class = "money")
"+.money" <- function(e1, e2) new_money(e1$amount + e2$amount)
"==.money" <- function(e1, e2) e1$amount == e2$amount
a <- new_money(5)
b <- new_money(7)
print((a + b)$amount)
print(a == b)Résultat :
[1] 12
[1] FALSEDéfi
FacileUne pile conserve ses éléments dans le champ items, le sommet de la pile étant le dernier. new_stack(), push() et pop() dans Stack.R sont fournis. Ajoutez trois méthodes :
length.stack()renvoie le nombre d’éléments.toString.stack()renvoie les éléments du sommet vers le bas, séparés par|, ouempty.summary.stack()renvoiestack of 3, top: c, oustack of 0lorsqu’elle est vide.
Le code fourni lit les commandes push <item> et pop, puis affiche la longueur, toString() et summary().
Votre code doit être placé dans Stack.R. main.R contient le code fourni de lecture des entrées et de production des sorties et ne peut pas être modifié.
Essayez vous-même
source("Stack.R")
# Code d'entrée/sortie fourni : le garder tel quel
input <- suppressWarnings(readLines(file("stdin")))
s <- new_stack()
for (cmd in input) {
if (cmd == "pop") s <- pop(s) else s <- push(s, substring(cmd, 6))
}
cat("length: ", length(s), "\n", sep = "")
cat("items: ", toString(s), "\n", sep = "")
cat(summary(s), "\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