2012-11-19 31 views
12

Đôi khi R ném tôi lỗi nhưLàm thế nào để tìm ra nơi xảy ra lỗi R?

Lỗi trong if (ncol (x) = 2!) {: Đối số là chiều dài không

không có thêm thông tin, khi tôi đã viết không có mã như vậy. Có cách nào chung để tìm ra hàm nào trong đó gói gây ra lỗi?

Vì hầu hết các gói đều được nén, nó không tầm thường đối với grep /usr/lib/R/library.

+0

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

+0

Đó 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

Trả lời

17

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 ff2 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ư debugdebugonce 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.

+0

Nitpick: Không phải 'f2' giả định đối số có độ dài> 0, đó là câu lệnh' if'. – naught101

16

Chỉ cần thêm vào những gì @SachaEpskamp đã đề xuất, thiết lập options(error=recover)options(show.error.locations=TRUE) có thể cực kỳ hữu ích khi gỡ lỗi mã không quen thuộc. Nguyên nhân đầu tiên R là khởi chạy phiên gỡ lỗi do lỗi, cho bạn tùy chọn gọi trình duyệt tại bất kỳ điểm nào trong ngăn xếp cuộc gọi đến lỗi đó. Tùy chọn thứ hai sẽ cho R biết bao gồm số dòng nguồn trong lỗi.

+2

Ngoài ra, nếu bạn đặt 'tùy chọn (cảnh báo = 2)' thì điều tương tự sẽ xảy ra khi cảnh báo, có thể hữu ích nếu bạn kết thúc các yếu tố được chuyển thành số không chính xác (gây 'NA', thường không phải là thứ bạn muốn – richiemorrisroe

+0

Vì vậy, hãy đặt tùy chọn của tôi thành các tùy chọn (error = recovery), các tùy chọn (show.error.locations = TRUE) và các tùy chọn (warn = 2), nhưng muốn đặt lại các tùy chọn này về trạng thái ban đầu của chúng. – stochasticcrap

+1

'o <- tùy chọn (lỗi = phục hồi, show.error.locations = TRUE, cảnh báo = 2); # làm công cụ; do.call (tùy chọn, o) # reset' Cảm thấy tự do để upvote nếu câu trả lời này đã giúp bạn. –

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