2016-01-14 17 views
9

Ho scritto uno script che dovrebbe interrompere l'esecuzione se i dati forniti non sono corretti. Tuttavia, anche se stop produce un messaggio di errore, lo script continua solo. Un esempio minimo:Come posso interrompere/terminare/fermare uno script in R?

if (TRUE) {stop("End of script?")} #It should stop here 
print("Script did NOT end!") # but it doesn't, because this line is printed! 

uscita della console:

> if (TRUE) {stop("End of script?")} 
Error: End of script? 
> print("Script did NOT end!") 
[1] "Script did NOT end!" 
> 

Questo non è in realtà sorprendente, perché da ?stop:

stops execution of the current expression and executes an error action.

Così finisce solo l'espressione corrente, non lo script. Ho trovato here che puoi racchiudere {} attorno allo script totale (o inserirlo in una funzione), ma sembra una soluzione alternativa piuttosto che una soluzione. Ovviamente, è buona pratica di programmazione rilevare gli errori e gestirli da soli (vedere ad esempio il collegamento nel commento di mra68), ma mi piacerebbe comunque sapere se riesco a fermare uno script in R.

Ho ha anche provato return e break, ma funziona solo in una funzione o ciclo. Ho cercato altre possibili parole chiave come "halt" e "end", ma senza fortuna. Mi sento un po 'stupido, perché sembra una domanda molto semplice.

Quindi, esiste un comando che può arrestare/arrestare/terminare il mio script con un errore irreversibile?

Sto eseguendo R 3.2.3 su Windows 8, ma ho avuto lo stesso problema con R 3.0.1 su MAC-OSX.

> sessionInfo() 
R version 3.2.3 (2015-12-10) 
Platform: x86_64-w64-mingw32/x64 (64-bit) 
Running under: Windows >= 8 x64 (build 9200) 

locale: 
[1] LC_COLLATE=Dutch_Netherlands.1252 LC_CTYPE=Dutch_Netherlands.1252 LC_MONETARY=Dutch_Netherlands.1252 
[4] LC_NUMERIC=C      LC_TIME=Dutch_Netherlands.1252  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

loaded via a namespace (and not attached): 
[1] tools_3.2.3 

PROVA SU MAC-OS, sessionInfo()

R version 3.0.1 (2013-05-16) 
Platform: x86_64-apple-darwin10.8.0 (64-bit) 

locale: 
[1] nl_NL.UTF-8/nl_NL.UTF-8/nl_NL.UTF-8/C/nl_NL.UTF-8/nl_NL.UTF-8 
+2

suggerisco, è mettere qualsiasi codice che si desidera eseguire in una funzione quindi chiamare tale funzione. Quindi puoi usare 'stop' e dovrebbe terminare la funzione in quel punto. L'istruzione della funzione in r può anche essere utilizzata per dichiarare metodi come in altri linguaggi di programmazione, che possono essere fuorvianti, suppongo. –

+1

Sul mio sistema (R versione 3.2.3, sistema operativo Windows 7) "stop" ha interrotto lo script. Se si guarda il codice sorgente di "stop", si vede che il suo comportamento dipende da alcune funzioni interne e queste potrebbero essere dipendenti dalla macchina. – mra68

+0

[Questo collegamento] (http://adv-r.had.co.nz/beyond-exception-handling.html) potrebbe essere utile. Ma se lo è, la domanda non è affatto di base. – mra68

risposta

6

Per quanto ho potuto trovare, non v'è alcun singolo comando che si ferma davvero in script ogni piattaforma/versione. Ci sono diversi modi per gestire questo:

metterlo in una funzione o parentesi graffe:

{ 
if (TRUE) {stop("The value is TRUE, so the script must end here")} 

print("Script did NOT end!") 
} 

o valutare l'errore e gestirlo come in un caso di costruzione altro:

if (TRUE) {stop("The value is TRUE, so the script must end here")  
    } else { #continue the script 
print("Script did NOT end!") 
    } 

O (EDIT): Un'altra possibilità è chiamare lo script da un R-scipt separato 'principale', con source("MyScript.R"). Quindi lo script termina. Questo, tuttavia, elimina tutti gli output tranne gli errori nella console.

OR per operazioni più complesse, utilizzare tryCatch() come mostrato here

Problemi correlati