Menu
Coddy logo textTech

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

Les 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 9

Le 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 FALSE
challenge icon

Défi

Facile

La classe Money dans Money.R possède les emplacements amount (numérique) et currency (caractère). Ajoutez quatre méthodes :

  • show() affiche 12.50 EUR et une nouvelle ligne ;
  • + pour deux objets Money renvoie leur somme, ou s’arrête avec cannot add EUR and USD (utilisez call. = FALSE) lorsque les devises diffèrent ;
  • * pour Money et un nombre renvoie le montant multiplié ;
  • == pour deux objets Money vaut TRUE lorsque 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 = ""))
}
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