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] NASfida
FacileCompleta 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")
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Le stringhe in dettaglio
Sottostringhe con substr()Formattazione con sprintf()Dividere e unireRicerca nelle stringheSostituzione del testoRipasso - Generatore di nomi utente4Matrici
Creazione di matriciIndicizzazione delle matriciRiepiloghi di righe e colonneOperazioni aritmetiche con le matriciRipasso - Schema dei posti a sedere10Flusso di controllo avanzato
La funzione switch()ifelse() vettorialerepeat e breakFunzioni ricorsiveRiepilogo - Classificatore di voti2Ricerche chiave-valore
Ricerche in vettori con nomiControllare le chiaviAggiungere e rimuovere chiaviIterare sui nomiRiepilogo - Sportello titoli5Progetto - Registro dei voti
Aggiungere studentiRegistrare i voti8Ordinamento e raggruppamento
Ordinare i vettoriOrdinare in base a una chiaveRaggruppare con split()Riepiloghi dei gruppiRipasso - Classifica11Gestione degli errori
Generare errori con stop()Gestire gli errori con tryCatch()Avvisi e finallyConvalidare l'inputRiepilogo - Calcolatrice sicura3Insiemi e conteggio
Valori univociOperazioni sugli insiemiTest di appartenenzaConteggio con table()Riepilogo - Ospiti dell’evento6Le funzioni come valori
Funzioni anonimePassare funzioniRestituire funzioniClosure con statoRiepilogo - Regole di sconto9DataFrame
Creare DataFrameColonne e righeFiltrare le righeAggiungere e ordinareRiepilogo - Report delle vendite12Progetto - Gestione delle spese
Registrare le speseSpesa totaleEsercitati da solo: Compilatore R online