Vérifier avec inherits()
Fait partie de la section Programmation orientée objet du Journey R de Coddy. Leçon 15 sur 57.
inherits(x, "employee") vérifie si employee se trouve quelque part dans le vecteur de classes de x ; il renvoie donc TRUE également pour les managers. La comparaison avec class(x) == "employee" vérifie chaque position séparément et renvoie un vecteur, ce qui échoue dans un if :
m <- structure(list(), class = c("manager", "employee"))
print(inherits(m, "employee"))
print(inherits(m, "intern"))
print(class(m) == "employee")Résultat :
[1] TRUE
[1] FALSE
[1] FALSE TRUEÉtant donné plusieurs noms, inherits() vaut TRUE lorsque l’objet possède l’un d’entre eux. Avec which = TRUE, il renvoie, pour chaque nom, sa position dans le vecteur de classes, ou 0 lorsqu’il est absent :
p <- structure(list(), class = c("fragile", "express", "parcel"))
print(inherits(p, c("letter", "parcel")))
print(inherits(p, c("express", "letter", "parcel"), which = TRUE))Sortie :
[1] TRUE
[1] 2 0 3Une fonction qui n’a de sens que pour une famille de classes vérifie son argument avec inherits() et s’arrête avec un message clair dans le cas contraire :
raise <- function(x, pct) {
if (!inherits(x, "employee")) stop("raise() needs an employee", call. = FALSE)
x$salary <- x$salary * (1 + pct / 100)
x
}
m <- structure(list(salary = 50000), class = c("manager", "employee"))
print(raise(m, 10)$salary)
print(tryCatch(raise(list(salary = 1), 10), error = function(e) conditionMessage(e)))Sortie :
[1] 55000
[1] "raise() needs an employee"Filter() avec inherits() sélectionne les membres d’une même famille dans une liste mixte, y compris chaque sous-classe :
staff <- list(
structure(list(name = "Ada"), class = c("manager", "employee")),
structure(list(name = "Bo"), class = "employee"),
structure(list(name = "Cy"), class = c("intern", "employee")),
structure(list(name = "Dee"), class = c("director", "manager", "employee"))
)
managers <- Filter(function(x) inherits(x, "manager"), staff)
print(vapply(managers, function(x) x$name, character(1)))Sortie :
[1] "Ada" "Dee"Défi
FacileUn catalogue contient des livres, des ebooks et des DVD. Les constructeurs sont définis dans Item.R, Book.R, Ebook.R et Dvd.R ; un ebook possède la classe c("ebook", "book", "item"). Dans Catalogue.R, complétez deux fonctions avec inherits() :
count_of(items, kind)renvoie le nombre d’éléments dont le vecteur de classes contientkind, quelle que soit sa position.titles_of(items, kind)renvoie les titres de ces éléments, dans leur ordre.
Le code fourni lit les lignes book Dune, ebook Emma, dvd Alien ainsi que les requêtes ? book, et affiche book: 2 (Dune, Emma), ou seulement dvd: 0 lorsqu’aucun élément ne correspond.
Votre code doit être placé dans Item.R, Book.R, Ebook.R, Dvd.R et Catalogue.R. main.R contient le code fourni pour les entrées et sorties et ne peut pas être modifié.
Essayez vous-même
source("Item.R")
source("Book.R")
source("Ebook.R")
source("Dvd.R")
source("Catalogue.R")
# Code d'entrée/sortie fourni : le garder tel quel
input <- suppressWarnings(readLines(file("stdin")))
items <- list()
for (line in input) {
p <- strsplit(line, " ")[[1]]
rest <- paste(p[-1], collapse = " ")
if (p[1] == "?") {
titles <- titles_of(items, p[2])
shown <- if (length(titles) > 0) paste0(" (", paste(titles, collapse = ", "), ")") else ""
cat(p[2], ": ", count_of(items, p[2]), shown, "\n", sep = "")
} else {
items[[length(items) + 1]] <- switch(p[1], book = new_book(rest), ebook = new_ebook(rest), dvd = new_dvd(rest))
}
}
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