Valider les entrées
Fait partie de la section Logique et flux d’exécution du Journey R de Coddy. Leçon 55 sur 64.
Les entrées provenant des utilisateurs ou des fichiers sont du texte et peuvent contenir n’importe quoi. Vérifiez-les avant de les utiliser : suppressWarnings(as.numeric(s)) renvoie NA pour le texte qui n’est pas un nombre, et is.na() permet de le tester :
read_age <- function(s) {
n <- suppressWarnings(as.numeric(s))
if (is.na(n)) return("not a number")
if (n < 0 || n > 130) return("out of range")
paste("age", n)
}
print(read_age("36"))
print(read_age("abc"))
print(read_age("200"))Sortie :
[1] "age 36"
[1] "not a number"
[1] "out of range"Un validateur peut recueillir tous les problèmes au lieu de s’arrêter au premier, ce qui fournit un retour plus utile. Ici, il renvoie un vecteur de messages, vide lorsque l’entrée est correcte :
check_password <- function(p) {
problems <- c()
if (nchar(p) < 8) problems <- c(problems, "too short")
if (!grepl("[0-9]", p)) problems <- c(problems, "needs a digit")
problems
}
print(check_password("abc"))
print(length(check_password("secret123")))Sortie :
[1] "too short" "needs a digit"
[1] 0Choisis le style en fonction de l’appelant de la fonction : renvoie un message lorsque l’appelant s’attend à recevoir une entrée incorrecte et l’affiche à l’utilisateur ; lève une erreur avec stop() lorsque l’entrée incorrecte indique un bug qui ne doit pas passer inaperçu.
# l'appelant s'attend à une entrée incorrecte et affiche le message
read_age("abc") # "not a number"
# une entrée incorrecte est une erreur dans le programme
if (!is.numeric(x)) stop("x must be numeric")La validation avec tryCatch() autour de l’étape d’analyse permet de garder le code principal exempt de vérifications : chaque enregistrement est soit converti, soit signalé :
parse_record <- function(line) {
parts <- strsplit(line, ",")[[1]]
if (length(parts) != 2) stop("expected 2 fields")
qty <- suppressWarnings(as.integer(parts[2]))
if (is.na(qty)) stop("quantity is not a whole number")
list(item = parts[1], qty = qty)
}
for (line in c("tea,2", "jam", "oil,x")) {
r <- tryCatch(parse_record(line), error = function(e) conditionMessage(e))
cat(line, ":", if (is.list(r)) paste("ok", r$qty) else r, "\n")
}Sortie :
tea,2 : ok 2
jam : expected 2 fields
oil,x : quantity is not a whole number Défi
FacileComplétez check_signup(name, age, email). Recensez chaque problème, dans cet ordre : name is empty (après avoir supprimé les espaces aux extrémités), age must be a number, age must be 13 or older (uniquement lorsque l’âge est un nombre), et email needs @. Renvoyez ok lorsqu’il n’y a aucun problème ; sinon, renvoyez les problèmes joints par ; .
Le code fourni lit le nom, l’âge et l’adresse e-mail (un par ligne), puis affiche la valeur renvoyée.
Essayez vous-même
check_signup <- function(name, age, email) {
# Écrivez votre code ici
"ok"
}
# Code d'entrée/sortie fourni : gardez-le tel quel
input <- suppressWarnings(readLines(file("stdin")))
cat(check_signup(input[1], input[2], input[3]), 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