2010-09-08 6 views
7

Ho scritto uno script shebang e vorrei eseguirlo da uno script Perl. Attualmente utilizzo system ($my_r_script_path, $r_script_arg1, $r_script_arg2, ...) e la mia domanda è: come posso verificare che lo script R termini normalmente (senza errori o avvisi).Come verificare la normale terminazione degli script R eseguiti da Perl?

suppongo che dovrei fare in modo che il mio script R restituisca un valore vero alla fine, solo se tutto è OK, quindi prendere questo valore in Perl, ma non sono sicuro di come farlo.

Grazie!

+1

http://stackoverflow.com/questions/3477916/using-perls-system#3478060 – daxim

+1

@daxim: Questa è solo la metà della risposta. L'altra metà è come impostare lo stato di uscita in uno script R. Quindi questa non è solo una domanda Perl, quindi non un duplicato dell'altra domanda, quindi mi oppongo anche alla proposta di chiudere questa domanda. –

+0

@Aristotle: Credo che David stia suggerendo una soluzione quando parla di restituire un vero valore nello script R. Non fa parte del requisito. – Zaid

risposta

4

È possibile impostare il valore di ritorno nel comando quit(), ad es. q(status=1). Il valore predefinito è 0, vedi anche? Uscire. Come catturarlo in Perl, è come prendere qualsiasi altro valore di ritorno in Perl. Viene salvato in una variabile speciale $? se ricordo bene. Vedi anche gli esempi nel perldoc per system, dovrebbe essere illustrato lì.

Su un sidenote, vorrei solo utilizzare l'interfaccia R-Perl. Si possono trovare informazioni ed esempi qui: http://www.omegahat.org/RSPerl/

Solo per completezza:

All'inizio dello script, si può mettere qualcosa di simile:

options(
    warn=2, # This will change all warnings into errors, 
      # so warnings will also be handled like errors 
    error= quote({ 
     sink(file="error.txt"); # save the error message in a file 
     dump.frames(); 
     print(attr(last.dump,"error.message")); 
     sink(); 
     q("no",status=1,FALSE) # standard way for R to end after errors 
    }) 
) 

questo salverà il messaggio di errore, e uscire dalla sessione R senza salvare, con il codice di uscita 1 e senza eseguire .Last.

Tuttavia, l'interfaccia R-Perl offre molte più possibilità che vale la pena di verificare se lo si farà più spesso.

+0

E come posso dire alla fine dello script se tutto è andato bene (incluso nessun avviso)? Devo impostare qualche blocco try attorno ad ogni comando che potrebbe fallire? O esiste un modo globale di terminare immediatamente qualsiasi errore/avviso e restituire un valore? –

+0

usa le opzioni di errore per quello. È possibile specificare qualsiasi funzione desiderata quando si verifica un errore, come illustrato in precedenza. Puoi anche impostare un avviso come errore utilizzando le opzioni (warn = 2). vedi anche http://stackoverflow.com/questions/3650444/r-script-line-numbers-at-error/3660847#3660847 –

+0

Grazie per la "completezza" (+1) –

Problemi correlati