2014-09-11 18 views
5

Tôi đã viết một tập lệnh R ghi các thông báo (báo cáo tiến trình) vào một tệp văn bản. Tôi đổi tùy chọn error để khi xảy ra lỗi, thông báo lỗi cũng được ghi vào tập tin đó:Dừng một tập lệnh R mà không nhận được thông báo "Lỗi trong khi kết thúc"

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

Nó hoạt động, nhưng tôi nhận được thông báo này trong giao diện điều khiển cửa sổ/thiết bị đầu cuối khi một lỗi nào xảy ra:

Error during wrapup: 
Execution halted 

Vì vậy, tôi nghĩ có cách tốt hơn để làm gián đoạn quá trình thực thi tập lệnh ... hay không?

+0

Tôi nghi ngờ bạn phải xóa 'stop()' khỏi điều này. – Andrie

+0

Điều gì xảy ra sau đó là nếu tôi chạy tập lệnh với Rscript.exe myscript.R, lỗi được báo cáo nhưng kịch bản chỉ tiếp tục mà không dừng lại. –

+0

Thử sử dụng q() thay vì dừng(). Trình xử lý lỗi được gọi bằng cách sử dụng hàm stop() của bạn, do đó dừng từ bên trong dừng ... có vẻ giống như đệ quy. Điều đó * có thể * là những gì là sai. –

Trả lời

5

Tôi chỉ tìm thấy mã nguồn R bên này:

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() làm cho xử lý lỗi để được thực thi. Nếu cuộc gọi stop() xảy ra trong trình xử lý lỗi, R hiển thị thông báo Error during wrapup: và ngăn bạn khỏi việc đệ quy vô hạn xảy ra nếu không.

Không gọi stop() từ bên trong options$error.

Sử dụng q(save="no", status=1, runLast=FALSE) thay vào đó, phải làm chính xác trình xử lý lỗi mặc định làm gì để sử dụng không tương tác. Xem ?options để biết ý nghĩa của options$error?stop để biết chi tiết về xử lý lỗi.

Các vấn đề liên quan