2014-09-11 8 views
5

Ho scritto uno script R che scrive i messaggi (rapporto di avanzamento) in un file di testo. Ho modificato l'opzione error in modo che quando si verifica un errore, il messaggio di errore è anche scritto al file:Arresto di uno script R senza ricevere il messaggio "Errore durante wrapup"

options(error = function() { 
cat(geterrmessage(),file = normalizePath("logs/messages.txt"),append = TRUE) 
stop() 
}) 

Funziona, ma ottengo questo messaggio nella finestra della console/terminale quando si verifica un errore:

Error during wrapup: 
Execution halted 

Quindi sto pensando che c'è un modo migliore per interrompere l'esecuzione dello script ... o c'è?

+0

Sospetto che sia necessario rimuovere 'stop()' da questo. – Andrie

+0

Quello che succede poi è che se eseguo lo script con Rscript.exe myscript.R, l'errore viene segnalato ma lo script va avanti senza fermarsi. –

+0

Prova a usare q() invece di stop(). Il gestore degli errori viene chiamato usando la funzione stop(), quindi fermarsi dall'interno di stop ... sembra una ricorsione. Questo * potrebbe * essere ciò che è sbagliato. –

risposta

5

Ho appena trovato questo codice sorgente R all'interno:

if (inError) { 
    /* fail-safe handler for recursive errors */ 
    if(inError == 3) { 
     /* Can REprintf generate an error? If so we should guard for it */ 
     REprintf(_("Error during wrapup: ")); 
     /* this does NOT try to print the call since that could 
      cause a cascade of error calls */ 
     Rvsnprintf(errbuf, sizeof(errbuf), format, ap); 
     REprintf("%s\n", errbuf); 
    } 

stop() fa sì che il gestore di errori da eseguire. Se la chiamata stop() si verifica all'interno del gestore degli errori, R visualizza il messaggio Error during wrapup: e impedisce la ricorsione infinita che si verificherebbe diversamente.

Non chiamare stop() dall'interno del telefono options$error.

Utilizzare invece q(save="no", status=1, runLast=FALSE), ciò dovrebbe fare esattamente ciò che il gestore di errori predefinito esegue per uso non interattivo. Vedere ?options per il significato di options$error e ?stop per dettagli sulla gestione degli errori.

Problemi correlati