Menu
Coddy logo textTech

Avertissements et finally

Fait partie de la section Logique et flux d’exécution du Journey R de Coddy. Leçon 54 sur 64.

Un avertissement signale un problème sans interrompre l’exécution : la fonction renvoie une valeur et R affiche l’avertissement à la fin. as.numeric() émet un avertissement pour le texte qui n’est pas un nombre et renvoie NA :

x <- as.numeric("abc")
print(x)

Sortie :

[1] NA
Warning message:
NAs introduced by coercion 

Comme les erreurs, les avertissements sont envoyés vers le flux d’erreurs ; sur Coddy, ils font donc échouer un test. suppressWarnings() les réduit au silence lorsque vous vérifiez vous-même le résultat, et tryCatch(..., warning = ) transforme un avertissement en valeur :

x <- suppressWarnings(as.numeric("abc"))
print(is.na(x))
r <- tryCatch(as.numeric("abc"), warning = function(w) paste("warned:", conditionMessage(w)))
print(r)

Résultat :

[1] TRUE
[1] "warned: NAs introduced by coercion"

warning("message") déclenche un avertissement depuis votre propre code. Un gestionnaire pour celui-ci fonctionne de la même manière que pour une erreur :

ratio <- function(a, b) {
  if (b == 0) warning("b is zero, returning Inf")
  a / b
}
r <- tryCatch(ratio(1, 0), warning = function(w) conditionMessage(w))
print(r)

Sortie :

[1] "b is zero, returning Inf"

finally = ... s’exécute après l’expression et tout gestionnaire, qu’une erreur se soit produite ou non. Utilisez-le pour les opérations qui doivent toujours avoir lieu, comme un message de fermeture :

load <- function(x) {
  tryCatch({
    if (x < 0) stop("negative")
    x * 10
  }, error = function(e) NA,
  finally = cat("finished", x, "\n"))
}
print(load(2))
print(load(-1))

Sortie :

finished 2 
[1] 20
finished -1 
[1] NA
challenge icon

Défi

Facile

Complétez to_numbers(texts). Convertissez chaque texte en nombre. Les valeurs qui ne peuvent pas être converties deviennent NA sans qu’aucun avertissement ne soit affiché. Retournez deux lignes : Numbers: avec les nombres convertis séparés par des espaces (y compris les valeurs NA), et Invalid: avec le nombre de valeurs qui ont échoué.

Le code fourni lit les textes sous forme de ligne séparée par des virgules et affiche chaque ligne renvoyée.

Essayez vous-même

to_numbers <- function(texts) {
  # Écrivez votre code ici
  c("Numbers: ", "Invalid: 0")
}

# Code d'entrée/sortie fourni : gardez-le tel quel
input <- suppressWarnings(readLines(file("stdin")))
cat(to_numbers(strsplit(input[1], ",")[[1]]), 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