Méthodes print et format
Fait partie de la section Programmation orientée objet du Journey R de Coddy. Leçon 4 sur 57.
Lorsqu’une valeur est affichée, R appelle la fonction print(). Sans rien de particulier pour la classe, un objet S3 est affiché comme sa liste suivie de l’attribut de classe, ce qui est difficile à lire :
m <- structure(list(amount = 9.5, currency = "EUR"), class = "money")
print(m)Sortie :
$amount
[1] 9.5
$currency
[1] "EUR"
attr(,"class")
[1] "money"Une méthode est une fonction nommée generic.class. Lorsque print() reçoit un objet de classe money, elle recherche print.money() et l’appelle à la place. Une méthode print écrit avec cat() et se termine par invisible(x), afin de renvoyer l’objet sans l’afficher une seconde fois :
print.money <- function(x, ...) {
cat("<money ", x$amount, " ", x$currency, ">\n", sep = "")
invisible(x)
}
m <- structure(list(amount = 9.5, currency = "EUR"), class = "money")
print(m)
mSortie :
<money 9.5 EUR>
<money 9.5 EUR>format() est le générique qui permet de transformer une valeur en texte. Une méthode format.money() renvoie le texte au lieu de l'afficher, afin que d'autre code puisse l'intégrer dans une phrase et que la méthode d'affichage puisse le réutiliser :
format.money <- function(x, ...) {
sprintf("%.2f %s", x$amount, x$currency)
}
print.money <- function(x, ...) {
cat("Money:", format(x), "\n")
invisible(x)
}
m <- structure(list(amount = 9.5, currency = "EUR"), class = "money")
m
cat("You owe", format(m), "\n")Sortie :
Money: 9.50 EUR
You owe 9.50 EUR Une méthode prend les mêmes arguments que son générique. print() et format() sont déclarées comme function(x, ...), leurs méthodes commencent donc également par x, .... Le ... accepte des arguments supplémentaires tels que digits qu’un appelant peut transmettre. Les méthodes fonctionnent partout où le générique est appelé, par exemple à l’intérieur de vapply() :
format.money <- function(x, ...) sprintf("%.2f %s", x$amount, x$currency)
wallet <- list(
structure(list(amount = 3, currency = "EUR"), class = "money"),
structure(list(amount = 0.5, currency = "USD"), class = "money")
)
print(vapply(wallet, format, character(1)))Sortie :
[1] "3.00 EUR" "0.50 USD"Défi
Facilenew_money() dans Money.R est fourni. Ajoutez deux méthodes au même fichier :
format.money(x, ...)renvoie le montant avec deux décimales et la devise :9.50 EUR.print.money(x, ...)affiche<money 9.50 EUR>sur sa propre ligne, en utilisantformat(), et renvoieinvisible(x).
Le code fourni lit les lignes 9.5 EUR, affiche chaque objet monétaire, puis affiche list: avec tous les montants formatés, joints par + .
Votre code doit être placé dans Money.R. main.R contient le code d’entrée/sortie fourni et ne peut pas être modifié.
Essayez vous-même
source("Money.R")
# Code d'entrée/sortie fourni : le garder tel quel
input <- suppressWarnings(readLines(file("stdin")))
all <- list()
for (line in input) {
p <- strsplit(line, " ")[[1]]
m <- new_money(as.numeric(p[1]), p[2])
print(m)
all[[length(all) + 1]] <- m
}
cat("list: ", paste(vapply(all, format, character(1)), collapse = " + "), "\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