Menu
Coddy logo textTech

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

Choisis 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 
challenge icon

Défi

Facile

Complé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")
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 Logique et flux d’exécution

Entraînez-vous par vous-même : Compilateur R en ligne