Bạn có thể sử dụng traceback()
để xác định vị trí xảy ra lỗi cuối cùng. Thông thường nó sẽ chỉ cho bạn một cuộc gọi bạn thực hiện trong chức năng của bạn. Sau đó, tôi thường đặt browser()
vào thời điểm đó, chạy lại chức năng và xem điều gì đang xảy ra.
Ví dụ, đây là hai chức năng:
f2 <- function(x)
{
if (x==1) "foo"
}
f <- function(x)
{
f2(x)
}
Lưu ý rằng f2()
giả định một cuộc tranh cãi về chiều dài 1
. Chúng ta có thể lạm dụng f
:
> f(NULL)
Error in if (x == 1) "foo" : argument is of length zero
Bây giờ chúng ta có thể sử dụng traceback()
để xác định vị trí những gì đã xảy ra:
> traceback()
2: f2(x) at #3
1: f(NULL)
Số nghĩa sâu như thế nào chúng tôi đang trong chức năng lồng nhau. Vì vậy, chúng tôi thấy rằng các cuộc gọi f
f2
và có lỗi ở dòng 3
. Khá rõ ràng. Chúng tôi có thể chỉ định lại f
với browser
được đặt ngay trước khi gọi f2
ngay bây giờ để kiểm tra đầu vào của nó. browser()
chỉ đơn giản là cho phép bạn ngừng thực hiện một chức năng và nhìn xung quanh trong môi trường của nó. Tương tự như debug
và debugonce
ngoại trừ việc bạn không phải thực thi mọi dòng cho đến thời điểm bạn biết có điều gì đó không ổn.
Nguồn
2012-11-19 14:39:59
Tôi tìm cách gỡ lỗi đơn giản nhất là thực hiện từng bước một dòng mã. Nếu lỗi của bạn đến từ một hàm bạn đã viết, bạn có thể gỡ lỗi bằng cách sử dụng 'debugonce (function_name)'. Điều này sẽ cho bạn một phiên R nhỏ bên trong phạm vi chức năng. – Justin
Đó là những gì tôi đã làm, nhưng tôi cảm thấy như tôi dành quá nhiều thời gian cho một thứ có thể được tự động hóa. – Tim