Menu
Coddy logo textTech

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] 3

Les 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] FALSE
challenge icon

Défi

Facile

Une 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 | , ou empty.
  • summary.stack() renvoie stack of 3, top: c, ou stack of 0 lorsqu’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 = "")
quiz iconTestez-vous

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

Entraînez-vous par vous-même : Compilateur R en ligne