2014-09-11 72 views
5

我寫了一個R消息,它將消息(進度報告)寫入文本文件。我修改了error選項,以便在發生錯誤時,該錯誤消息也將寫入該文件:停止R腳本而不會在「包裝過程中發生錯誤」消息

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

它的工作原理,但如果確實發生了錯誤,我得到的控制檯/終端窗口此消息:

Error during wrapup: 
Execution halted 

所以我想有一個更好的方法來中斷腳本的執行......還是有?

+0

我懷疑你必須從中刪除'stop()'。 – Andrie 2014-09-11 08:05:20

+0

然後會發生什麼情況是,如果我使用Rscript.exe myscript.R運行腳本,則會報告錯誤,但腳本不會停止。 – 2014-09-12 23:09:51

+0

嘗試使用q()而不是stop()。錯誤處理程序會使用stop()函數調用,所以在stop內停止......聽起來像遞歸。這*可能是錯的。 – 2014-11-21 14:42:20

回答

5

我剛剛找到這裏面的R源之中的代碼:

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()導致要執行的錯誤處理程序。如果stop()調用發生在錯誤處理程序中,則R將顯示Error during wrapup:消息,並阻止您進行無限遞歸,否則將會發生這種情況。

請勿在options$error之內撥打stop()

改爲使用q(save="no", status=1, runLast=FALSE),它應該完成默認錯誤處理程序爲非交互式使用所做的操作。有關錯誤處理的詳細信息,請參閱?options以瞭解options$error?stop的含義。

相關問題