Equivalente di "lancio" in R


141

Come si "lancia" un errore in R? Ho una funzione che prende un frame di dati e alcuni nomi di colonne e fa cose con loro. Se le colonne non esistono, desidero interrompere la funzione e interrompere tutte le funzioni a seconda di essa.

Ho guardato recovere browsee traceback, beh, sembravano vicini ma non quello che cercavo.


2
Giusto, ripristino, browser e traceback sono per il debug, mentre i sistemi try / catch sono per la gestione degli errori nel codice di produzione.
Harlan,

20
Adoro quando i richiedenti usano il nome della funzione che stanno cercando più volte in una domanda;)
Hadley

Penso che ci sia una ragione per cui questa domanda ha più voti della risposta migliore. Anche se questa altra domanda è tecnicamente fuori tema, è quel tipo di sommario ottimamente stretto di un argomento sconosciuto per cui Stack Overflow è famoso.
Josiah Yoder,

Risposte:


113

Vedi help(tryCatch):

Le condizioni sono segnalate da ' signalCondition'. Inoltre, le funzioni
' stop' e ' warning' sono state modificate per accettare anche
argomenti di condizione.

e in seguito sotto "Vedi anche":

' stop' e ' warning' condizioni del segnale e ' try' è essenzialmente una versione semplificata di ' tryCatch'.

quindi probabilmente vuoi stop.


24
Funziona perfettamente. R è così strano, non per colpa sua - è stato progettato molto prima che noi appianassimo un buon design del linguaggio interpretato.
Forkandwait,

5
Secondo gli autori, è stato fortemente influenzato da Scheme, che è sia antico che buono. R è "lispy" ma con strutture di dati funky. Le parti "interessanti" in R sono probabilmente legate al fatto che molte convenzioni differiscono dalle altre lingue, in particolare dalla famiglia del linguaggio C che è anche sintatticamente vicino. Immagino perché il linguaggio è stato sviluppato da un gruppo di statistici che avevano bisogno di un buon strumento, piuttosto che da sviluppatori che avevano bisogno di un buon strumento. Il fatto che il "punto" sia solo un personaggio ha richiesto molto tempo per essere
interpretato

5
Alcuni esempi di base qui sarebbero fantastici, non solo citazioni. Qui stackoverflow.com/a/23917007/54964
Léo Léopold Hertz

Sono arrivato a questa domanda quando ho cercato come ricodificare un errore in R con un messaggio di errore più sano, ma mantenendo intatta la traccia (come in, esegui traceback()dopo l'errore per vedere cosa è andato storto). Utilizzando stopin errorargomento della tryCatchvolontà rovinare la traccia. Tuttavia, l' finallyargomento consentirà di inviare un messaggio aggiuntivo e manterrà utile la traccia. Non proprio sull'argomento, ma, credo, abbastanza importante da giustificare alcuni svantaggi e una minaccia di moderazione che respinge questo commento dalla finestra. :-)
Mali Remorker il


8

Oltre le funzioni di base che Dirk menziona:

Il pacchetto R.oo ha funzionalità di gestione delle eccezioni aggiuntive, inclusa una funzione throw () che è molto utile. Puoi catturare le eccezioni con le solite funzioni di prova o di trycatch:

> try(throw("Division by zero.")); print("It's ok!");
Error: [2009-10-22 10:24:07] Exception: Division by zero.
[1] "It's ok!"

Puoi leggere di più qui: http://www1.maths.lth.se/help/R/R.oo/


8
Hehe. R non è abbastanza funky senza OO? Mi dispiace essere capovolto, e sicuramente grazie per la risposta interessante, ma andrò con la semplice vecchia fermata () sopra.
Forkandwait,

1
Ora c'è ancora più OO. :)
Iteratore

3
@ws. Cosa c'è di così strano in R? plottraccia una funzione, try stop warntutto funziona come ti aspetteresti, e quasi tutto ciò che voglio fare è una linea.
isomorfismi

4
Spesso il "potere di una linea" non è una buona metrica per una lingua. Per molti di noi il codice leggibile e comprensibile supera meno righe. In effetti, molto è incomprensibile per me perché sono un principiante e cerco di calibrare le aspettative di conseguenza. Ma altre lingue rendono abbastanza intuitivo passare da 0 a fare cose. R sembra anche aver sviluppato una cultura di battute di una linea intelligenti, difficili da leggere. Discuterei per una cultura di codice tipicamente inglese, che spesso potrebbe anche essere una linea, come Ruby.
Filippo,

6

In realtà la funzione stopifnotè molto conveniente per implementare controlli di integrità nel tuo codice. Accetta diverse espressioni logiche e restituisce un errore se uno di essi viene considerato falso.

Esempio: per verificare se la colonna 'c' esiste nel frame di dati 'df':

df <- data.frame(a = numeric(), b = numeric())
stopifnot(!is.null(df$c))

Questo genererà il seguente errore:

Error: !is.null(df$c) is not TRUE

Sembra che Python's assert(...)...
Josiah Yoder

1

Puoi controllare se la colonna esiste e fare quello che vuoi.
Supponi un data.framenome df1e controlla se col1esiste una colonna :

if(! any(grepl('^col1$',colnames(df1)))) stop("nonexistent column")

o

if(! any(grepl('^col1$',colnames(df1)))) return(-1)

Per esempio

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.