Tôi quan sát thấy sự khác biệt giữa phiên R tương tác và không tương tác về traceback()
mà tôi không hiểu. Đối với mã bên dưới, nó sẽ tạo ra lỗi, nhưng trong phiên R tương tác, tôi có thể xem thông tin truy nguyên, trong khi nếu tôi lưu mã vào test.R
và gọi mã qua số Rscript test.R
hoặc R -f test.R
, tôi không còn có thể xem traceback:traceback() cho các phiên R tương tác và không tương tác
f = function() {
on.exit(traceback())
1 + 'a'
}
f()
Trong một phiên R tương tác: thực hiện
> f = function() {
+ on.exit(traceback())
+ 1 + 'a'
+ }
> f()
Error in 1 + "a" : non-numeric argument to binary operator
1: f()
không tương tác:
$ Rscript test.R
Error in 1 + "a" : non-numeric argument to binary operator
Calls: f
No traceback available
Execution halted
tôi không thấy lời giải thích trong số ?traceback
và tôi tự hỏi liệu có cách nào để bật truy xuất cho các phiên R không tương tác hay không. Cảm ơn!
'traceback' tìm kiếm một đối tượng được gọi là '.Traceback' trong' baseenv() '. Nó trông (từ 'src/main/errors.c') như thế này chỉ được tạo nếu, trong số các điều kiện khác,' R_Interactive || hasHandler'. Không có '.Traceback', bạn sẽ nhận được thông báo" Không có traceback ". Ngoài ra còn có một cảnh báo dưới '? Traceback' đề cập đến' .Traceback'. – BenBarnes
Nếu bạn chỉ thiết lập các tùy chọn (error = traceback) trong kịch bản và xóa cuộc gọi on.exit, bạn sẽ có hiệu ứng mong muốn. Mặc dù nó tạo ra trùng lặp vì "bước" của lỗi. –
@BrandonBertelsen, Theo như tôi có thể nói, điều đó vẫn sẽ không cung cấp cho bạn quyền truy cập vào thông tin truy nguyên, mặc dù ngăn xếp cuộc gọi được trả lại trong trường hợp xảy ra lỗi trong phiên không tương tác. – BenBarnes