Méthodes pour les fonctions intégrées
Fait partie de la section Programmation orientée objet du Journey R de Coddy. Leçon 28 sur 57.
setMethod() ajoute également des méthodes S4 aux fonctions de base telles que length() et summary(). La fonction de base continue de fonctionner pour tout le reste, et votre classe bénéficie de son propre comportement :
setClass("Playlist", slots = c(name = "character", songs = "character"))
setMethod("length", "Playlist", function(x) length(x@songs))
pl <- new("Playlist", name = "gym", songs = c("a", "b", "c"))
print(length(pl))
print(length(c(1, 2)))Sortie :
[1] 3
[1] 2Les opérateurs sont également des génériques. Une méthode pour + nomme les classes des deux côtés dans une signature(). Les deux arguments sont appelés e1 et e2 :
setClass("Money", slots = c(amount = "numeric"))
setMethod("show", "Money", function(object) cat(sprintf("%.2f", object@amount), "\n"))
setMethod("+", signature("Money", "Money"), function(e1, e2) {
new("Money", amount = e1@amount + e2@amount)
})
new("Money", amount = 2.5) + new("Money", amount = 4)Résultat :
6.50 Le générique de groupe Arith représente +, -, *, /, ^ et tous les autres à la fois. Dans sa méthode, callGeneric() répète l’opérateur utilisé, sur les valeurs que vous transmettez :
setClass("Money", slots = c(amount = "numeric"))
setMethod("Arith", signature("Money", "numeric"), function(e1, e2) {
new("Money", amount = callGeneric(e1@amount, e2))
})
m <- new("Money", amount = 10)
cat((m * 3)@amount, (m / 4)@amount, (m - 1)@amount)Résultat :
30 2.5 9Le générique de groupe Compare couvre ==, <, > et les autres. Sa méthode renvoie ce que callGeneric() renvoie pour les slots, une valeur logique :
setClass("Money", slots = c(amount = "numeric"))
setMethod("Compare", signature("Money", "Money"), function(e1, e2) {
callGeneric(e1@amount, e2@amount)
})
a <- new("Money", amount = 5)
b <- new("Money", amount = 8)
cat(a < b, a == b, a >= b)Sortie :
TRUE FALSE FALSEDéfi
FacileLa classe Money dans Money.R possède les emplacements amount (numérique) et currency (caractère). Ajoutez quatre méthodes :
show()affiche12.50 EURet une nouvelle ligne ;+pour deux objetsMoneyrenvoie leur somme, ou s’arrête aveccannot add EUR and USD(utilisezcall. = FALSE) lorsque les devises diffèrent ;*pourMoneyet un nombre renvoie le montant multiplié ;==pour deux objetsMoneyvautTRUElorsque le montant et la devise sont tous deux égaux.
Le code fourni lit les lignes 10:EUR + 2.5:EUR, 4:USD * 3 ou 1:EUR == 1:EUR et affiche le résultat ou error: suivi du message.
Votre code doit être placé dans Money.R. main.R contient le code fourni pour les entrées et sorties 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")))
parse_money <- function(t) {
p <- strsplit(t, ":")[[1]]
new("Money", amount = as.numeric(p[1]), currency = p[2])
}
for (line in input) {
p <- strsplit(line, " ")[[1]]
a <- parse_money(p[1])
tryCatch({
if (p[2] == "+") print(a + parse_money(p[3]))
if (p[2] == "*") print(a * as.numeric(p[3]))
if (p[2] == "==") cat(a == parse_money(p[3]), "\n", sep = "")
}, error = function(e) cat("error: ", conditionMessage(e), "\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 personnel6S4 Génériques et méthodes
Création de génériquesMéthodes pour les fonctions intégréesDispatch sur deux argumentssetValidity et validObjectRécapitulatif - Argent et deviseEntraînez-vous par vous-même : Compilateur R en ligne