2010-09-08 9 views
7

Ich habe ein shebang R-Skript geschrieben und möchte es aus einem Perl-Skript ausführen. Ich verwende derzeit system ($my_r_script_path, $r_script_arg1, $r_script_arg2, ...) und meine Frage ist, wie kann ich überprüfen, ob das R-Skript normal beendet (keine Fehler oder Warnungen).Wie überprüfen Sie die normale Beendigung von R-Skripten, die von Perl ausgeführt werden?

Ich denke, ich sollte mein R-Skript einen wahren Wert am Ende zurückgeben, nur wenn alles in Ordnung ist, dann fangen Sie diesen Wert in Perl, aber ich bin mir nicht sicher, wie das geht.

Danke!

+1

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

+1

@daxim: Das ist nur die halbe Antwort. Die andere Hälfte stellt fest, wie der Beendigungsstatus in einem R-Skript festgelegt wird. Das ist also nicht nur eine Perl-Frage, also kein Duplikat der anderen Frage, daher lehne ich auch den Antrag ab, diese Frage zu beenden. –

+0

@Aristotle: Ich glaube, dass David eine Lösung vorschlägt, wenn er davon redet, im R-Skript einen wahren Wert zurückzugeben. Es ist nicht Teil der Anforderung. – Zaid

Antwort

4

Sie können den Rückgabewert im Befehl quit() setzen, z. B. q(status=1). Standard ist 0, siehe auch? Quit. Wie man das in Perl fängt, ist, als ob man irgendeinen anderen Rückgabewert in Perl fängt. Es wird in einer speziellen Variablen $? gespeichert, wenn ich mich recht erinnere. Siehe auch die Beispiele in der Perldoc für system, es sollte dort veranschaulicht werden.

Auf einer Nebenbemerkung würde ich nur die R-Perl-Schnittstelle verwenden. Sie können hier Informationen und Beispiele finden: http://www.omegahat.org/RSPerl/

Nur der Vollständigkeit halber:

Zu Beginn des Skripts können Sie so etwas wie gesagt:

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 
    }) 
) 

Dies wird die Fehlermeldung speichern und aus der R-Sitzung ausbrechen, ohne zu speichern, mit Exit-Code 1 und ohne die .Last auszuführen.

Dennoch bietet die R-Perl-Schnittstelle viel mehr Möglichkeiten, die es wert sind, überprüft zu werden, wenn Sie dies öfter tun werden.

+0

Und wie kann ich am Ende des Skripts feststellen, ob alles in Ordnung war (einschließlich keine Warnungen)? Muss ich einen Try-Block um jeden fehlgeschlagenen Befehl setzen? Oder gibt es einen globalen Weg, um sofort bei einem Fehler/einer Warnung zu beenden und einen Wert zurückzugeben? –

+0

Verwenden Sie die Fehleroptionen dafür. Sie können jede gewünschte Funktion angeben, wenn ein Fehler auftritt, wie ich es zuvor gezeigt habe. Sie können eine Warnung auch als Fehler ausgeben, indem Sie Optionen verwenden (warn = 2). siehe auch http://stackoverflow.com/questions/3650444/r-script-line-numbers-at-error/3660847#3660847 –

+0

Danke für die "Vollständigkeit" (+1) –

Verwandte Themen