Lever des erreurs avec stop()
Fait partie de la section Logique et flux d’exécution du Journey R de Coddy. Leçon 52 sur 64.
stop("message") déclenche une erreur : la fonction s’arrête immédiatement, rien de ce qui suit ne s’exécute et R affiche le message. Utilisez-le lorsqu’une fonction reçoit une entrée qu’elle ne peut pas traiter :
check_qty <- function(q) {
if (q <= 0) stop("quantity must be positive")
q
}
print(check_qty(3))
print(check_qty(-1))
print("never printed")Sortie :
[1] 3
Error in check_qty(-1) : quantity must be positive
Calls: print -> check_qty
Execution haltedLe texte de l’erreur indique l’appel qui a échoué, et Execution halted signifie que tout le script s’est arrêté : le dernier print() n’a jamais été exécuté. Une erreur est écrite dans le flux d’erreurs, et non dans la sortie normale ; ainsi, sur Coddy, un test échoue lorsqu’une erreur ou un avertissement est affiché.
stopifnot() vérifie plusieurs conditions à la fois et déclenche une erreur pour la première qui vaut FALSE. Une condition nommée utilise son nom comme message :
area <- function(w, h) {
stopifnot("width must be positive" = w > 0, "height must be positive" = h > 0)
w * h
}
print(area(2, 3))
print(area(2, -1))Sortie :
[1] 6
Error in area(2, -1) : height must be positive
Calls: print -> area -> stopifnot
Execution haltedConstruisez le message à partir des valeurs avec paste0() ou sprintf(), afin que le lecteur voie ce qui n’allait pas :
get_item <- function(items, i) {
if (i > length(items)) stop(sprintf("index %d is past the end (%d items)", i, length(items)))
items[i]
}
print(get_item(c("a", "b"), 5))Sortie :
Error in get_item(c("a", "b"), 5) : index 5 is past the end (2 items)
Calls: print -> get_item
Execution haltedLevez les erreurs au début d’une fonction, avant qu’un quelconque travail ne soit effectué. Les vérifications qui interrompent rapidement l’exécution gardent le reste de la fonction simple, car celle-ci peut supposer que l’entrée est valide :
withdraw <- function(balance, amount) {
if (amount <= 0) stop("amount must be positive")
if (amount > balance) stop("insufficient funds")
balance - amount
}Défi
FacileComplétez make_order(item, qty, stock). Levez une erreur avec stop() :
quantity must be at least 1lorsqueqtyest inférieur à 1only <stock> leftlorsqueqtyest supérieur àstock, par exempleonly 3 left
Sinon, renvoyez ordered <qty> x <item>.
Le code fourni lit l'article, la quantité et le stock, appelle votre fonction et affiche soit son résultat, soit Error: suivi du message d'erreur ; ainsi, aucun test n'affiche jamais le propre texte d'erreur de R.
Essayez vous-même
make_order <- function(item, qty, stock) {
# Écrivez votre code ici
""
}
# Code d'entrée/sortie fourni : gardez-le tel quel
input <- suppressWarnings(readLines(file("stdin")))
result <- tryCatch(make_order(input[1], as.numeric(input[2]), as.numeric(input[3])),
error = function(e) paste("Error:", conditionMessage(e)))
cat(result, sep = "\n")
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Logique et flux d’exécution
1Les chaînes en profondeur
Sous-chaînes avec substr()Mise en forme avec sprintf()Scinder et joindreRechercher dans les chaînesRemplacer du texteRécapitulatif - Créateur de nom d'utilisateur4Matrices
Créer des matricesIndexer des matricesRécapitulatifs des lignes et des colonnesArithmétique matricielleRécapitulatif - Plan de salle7La famille Apply
lapply et sapplyMap et mapplyFilter et FindReduceRécapitulatif - Pipeline de données10Structures de contrôle avancées
La fonction switch()ifelse() vectorisérepeat et breakFonctions récursivesRécapitulatif – Classificateur de notes2Recherches par clé-valeur
Recherches dans des vecteurs nommésVérifier les clésAjouter et supprimer des clésParcourir les nomsRécapitulatif - Bureau des stocks5Projet - Carnet de notes
Ajouter des élèvesEnregistrer les notes8Trier et regrouper
Trier des vecteursTrier selon une cléRegrouper avec split()Synthèses des groupesRécapitulatif - Classement11Gestion des erreurs
Lever des erreurs avec stop()Intercepter avec tryCatch()Avertissements et finallyValider les entréesRécapitulatif - Calculatrice sécurisée3Ensembles et comptage
Valeurs uniquesOpérations sur les ensemblesTests d’appartenanceCompter avec table()Récapitulatif - Invités à l’événement6Les fonctions comme valeurs
Fonctions anonymesPasser des fonctionsRetourner des fonctionsFermetures avec étatRécapitulatif - Règles de remise9Data Frames
Créer des Data FramesColonnes et lignesFiltrer les lignesAjouter et trierRécapitulatif - Rapport des ventes12Projet - Suivi des dépenses
Enregistrer les dépensesDépenses totalesEntraînez-vous par vous-même : Compilateur R en ligne