2010-09-08 20 views
7

我寫了一個shebang R腳本,並希望從Perl腳本執行它。我目前使用system ($my_r_script_path, $r_script_arg1, $r_script_arg2, ...),我的問題是如何驗證R腳本正常終止(沒有錯誤或警告)。如何驗證從Perl執行的R腳本的正常終止?

猜測我應該讓我的R腳本在最後返回一些真正的值,只要一切正常,然後在Perl中捕獲這個值,但我不知道該怎麼做。

謝謝!

+1

http://stackoverflow.com/questions/3477916/using-perls-system#3478060 – daxim 2010-09-08 07:30:45

+1

@daxim:這只是答案的一半。另一半是如何在R腳本中設置退出狀態。所以這不僅僅是一個Perl問題,因此不是另一個問題的重複,所以我也反對關閉這個問題的動議。 – 2010-09-08 07:37:23

+0

@Aristotle:我相信當David談到在R腳本中返回一個真正的價值時,他正在提出一個解決方案。這不是要求的一部分。 – Zaid 2010-09-08 08:03:18

回答

4

您可以在命令quit()中設置返回值,例如q(status=1)。默認值是0,另請參閱?退出。如何用Perl捕捉那個,就像在Perl中捕獲任何其他返回值。如果我沒有記錯,它被保存在一個特殊的變量$?中。請參閱perldoc中的示例system,應該在那裏說明。

在旁註中,我只是使用R-Perl接口。你可以找到信息和例子在這裏: http://www.omegahat.org/RSPerl/

只是爲了完整性:

在腳本的開始,你可以把這樣的:

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

這將節省的錯誤信息,退出R會話而不保存,退出代碼1並且不運行.Last。

儘管如此,R-Perl界面還是提供了很多值得檢查的可能性,如果你打算更經常這樣做的話。

+0

如果一切正常(包括沒有警告),我該如何告訴腳本的末尾?我是否必須爲每個可能失敗的命令設置一些try塊?還是有一些全球性的方式來立即終止任何錯誤/警告並返回一些值? – 2010-09-08 08:39:17

+0

使用該錯誤選項。正如我前面所說明的那樣,您可以指定發生錯誤時所需的任何功能。您也可以通過使用選項(警告= 2)使任何警告成爲錯誤。另見http://stackoverflow.com/questions/3650444/r-script-line-numbers-at-error/3660847#3660847 – 2010-09-08 09:27:50

+0

感謝您的「完整性」(+1) – 2010-09-08 14:43:18