Vérifications de validité
Fait partie de la section Programmation orientée objet du Journey R de Coddy. Leçon 24 sur 57.
Les types sont vérifiés par R ; les règles concernant les valeurs vous incombent. L’argument validity de setClass() est une fonction de object qui renvoie TRUE lorsque l’objet est correct, ou une chaîne de caractères décrivant le problème. new() l’exécute pour chaque objet :
setClass("Account", slots = c(owner = "character", balance = "numeric"),
validity = function(object) {
if (object@balance < 0) return("balance must not be negative")
TRUE
})
ok <- new("Account", owner = "Ada", balance = 10)
msg <- tryCatch(new("Account", owner = "Bo", balance = -5), error = function(e) conditionMessage(e))
cat(msg)Sortie :
invalid class “Account” object: balance must not be negativeUne fonction de validité peut signaler plusieurs problèmes à la fois en renvoyant un vecteur de chaînes de caractères. R les numérote dans le message d’erreur :
setClass("Range", slots = c(lo = "numeric", hi = "numeric"),
validity = function(object) {
problems <- character(0)
if (length(object@lo) != 1) problems <- c(problems, "lo must be one number")
if (length(object@hi) != 1) problems <- c(problems, "hi must be one number")
if (length(problems) == 0) TRUE else problems
})
msg <- tryCatch(new("Range", lo = c(1, 2), hi = numeric(0)), error = function(e) conditionMessage(e))
cat(msg)Sortie :
invalid class “Range” object: 1: lo must be one number
invalid class “Range” object: 2: hi must be one number@<- vérifie le type, mais n’exécute pas la fonction de validité, donc une affectation peut enfreindre une règle. validObject() relance la vérification appelez-la après avoir modifié les slots :
setClass("Account", slots = c(balance = "numeric"),
validity = function(object) if (object@balance < 0) "balance must not be negative" else TRUE)
a <- new("Account", balance = 10)
a@balance <- -99
cat("still created:", a@balance, "\n")
msg <- tryCatch(validObject(a), error = function(e) conditionMessage(e))
cat(msg, "\n")Sortie :
still created: -99
invalid class “Account” object: balance must not be negative R place invalid class “Account” object: devant votre texte. Le code qui affiche le message à l’utilisateur peut ne conserver que la partie après object: :
setClass("Account", slots = c(balance = "numeric"),
validity = function(object) if (object@balance < 0) "balance must not be negative" else TRUE)
msg <- tryCatch(new("Account", balance = -1), error = function(e) conditionMessage(e))
cat(sub(".*object: ", "", msg))Sortie :
balance must not be negativeDéfi
FacileDéclarez la classe Rating dans Rating.R avec les emplacements stars (numérique) et comment (chaîne de caractères), ainsi qu’une fonction de validation qui renvoie la première règle enfreinte :
stars must be a whole number from 1 to 5lorsque le nombre d’étoiles n’est pas l’un des nombres 1, 2, 3, 4 ou 5 ;comment is too longlorsque le commentaire comporte plus de 20 caractères.
Sinon, elle renvoie TRUE. Le code fourni lit les lignes 4;Great (le commentaire peut être absent), crée chaque évaluation et affiche ok: 4/5 ou le texte du problème.
Votre code doit être placé dans Rating.R. main.R contient le code fourni d’entrée/sortie et ne peut pas être modifié.
Essayez vous-même
source("Rating.R")
# Code d'entrée/sortie fourni : le garder tel quel
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
p <- strsplit(line, ";")[[1]]
out <- tryCatch({
r <- new("Rating", stars = as.numeric(p[1]), comment = if (length(p) > 1) p[2] else "")
paste0("ok: ", r@stars, "/5")
}, error = function(e) sub(".*object: ", "", conditionMessage(e)))
cat(out, "\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