Menu
Coddy logo textTech

Avvisi e finally

Fa parte della sezione Logica e flusso del percorso R di Coddy. Lezione 54 di 64.

Un avviso segnala un problema senza interrompere l'esecuzione: la funzione restituisce un valore e R stampa l'avviso alla fine. as.numeric() genera un avviso per il testo che non è un numero e restituisce NA:

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

Output:

[1] NA
Warning message:
NAs introduced by coercion 

Come gli errori, gli avvisi vengono inviati al flusso degli errori, quindi su Coddy fanno fallire un test. suppressWarnings() li silenzia quando controlli tu il risultato, e tryCatch(..., warning = ) trasforma un avviso in un valore:

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

Output:

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

warning("message") genera un avviso dal tuo codice. Un gestore per questo funziona come uno per un errore:

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)

Output:

[1] "b is zero, returning Inf"

finally = ... viene eseguito dopo l’espressione e qualsiasi gestore, indipendentemente dal fatto che si sia verificato o meno un errore. Usalo per le operazioni che devono avvenire sempre, ad esempio un messaggio di chiusura:

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))

Output:

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

Sfida

Facile

Completa to_numbers(texts). Converti ogni testo in un numero. I valori che non possono essere convertiti diventano NA senza che venga stampato alcun avviso. Restituisci due righe: Numbers: con i numeri convertiti uniti da spazi (inclusi i valori NA) e Invalid: con il numero di valori non convertiti.

Il codice fornito legge i testi come una riga separata da virgole e stampa ogni riga restituita.

Provalo tu

to_numbers <- function(texts) {
  # Write your code here
  c("Numbers: ", "Invalid: 0")
}

# Supplied input/output code: keep it as it is
input <- suppressWarnings(readLines(file("stdin")))
cat(to_numbers(strsplit(input[1], ",")[[1]]), sep = "\n")
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Logica e flusso

Esercitati da solo: Compilatore R online