2014-04-13 14 views
5

Làm cách nào để tìm ra lỗi Xảy ra ở đâu?Tìm hiểu WHERE xảy ra lỗi trong R khi gỡ lỗi

tôi đã có một vòng lặp đôi như thế này

companies <- # vector with all companies in my data.frame 
dates <- # vector with all event dates in my data.frame 

for(i in 1:length(companies)) { 
    events_k <- # some code that gives me events of one company at a time 

    for{j in 1:nrow(events_k)) { 
    # some code that gives me one event date at a time 
    results <- # some code that calculates stuff for that event date 

} 

mylist[[i]] <- results # store the results in a list 
} 

Trong mã này, tôi đã nhận ra lỗi (nó là một cái gì đó như lỗi trong max (i) ...) Các vòng lặp bên trong hoạt động hoàn hảo. Vì vậy, bằng cách rời khỏi vòng lặp bên ngoài và nhập thủ công ID của công ty cho đến khi lỗi đó xuất hiện, tôi phát hiện ra công ty nào đã xảy ra sự cố. Data.frame của tôi có các chữ cái trong một véc tơ có lợi nhuận hàng ngày cho công ty cụ thể đó.

Lần sau: Có cách nào trong R để tìm ra WHERE (hoặc ở đây CHO MỌI CÔNG TY) lỗi xuất hiện không? Nó có thể tiết kiệm rất nhiều thời gian!

+2

một cách dễ dàng là in 'i' &' j' trong mỗi lần chạy vòng lặp, vì vậy bạn biết khi nào nó không thành công ... –

+0

Bạn có lỗi cú pháp trong vòng lặp thứ hai cho vòng lặp! Bạn nhận được lỗi này: 'Lỗi: không mong muốn '{' trong:'. Tôi tin rằng trường hợp này không quan trọng, nhưng RStudio có một vài công cụ gỡ lỗi đã được đưa vào. – marbel

+2

Nhập 'traceback()'. Xem thêm '? Debug','? Trace', '? Browser','? Recovery' – GSee

Trả lời

0

Rất khó để biết không có mã rõ ràng rằng chúng ta có thể chạy, nhưng tôi đoán là thay đổi mã của bạn để

for(i in companies) { 
    for(j in dates) { 

hoặc cách khác

for(i in 1:length(companies)) { 
    for(j in 1:length(dates)) { 

có thể giải quyết vấn đề này. Lưu ý số ( trong vòng lặp thứ hai. Nếu không, bạn nên chỉnh sửa ví dụ để có một số mã/dữ liệu tạo ra cùng một lỗi.

Để tìm hiểu xem nó xảy ra ở đâu, bạn luôn có thể thêm print(i) hoặc thứ gì đó tương tự tại vị trí thích hợp trong mã.

+0

aww yeah! thực sự tôi đã sử dụng một cái gì đó giống như cách tiếp cận thứ hai của bạn. Cảm ơn bạn. Tôi đã chỉnh sửa câu hỏi! – cptn

4

Những gì tôi muốn sử dụng là:

options(error = recover) 

Bạn chỉ cần chạy nó một lần vào đầu phiên giao dịch của bạn (hoặc thêm nó vào tập tin .Rprofile của bạn)

Sau đó, mỗi lần một lỗi được ném, bạn sẽ được hiển thị chồng các cuộc gọi hàm dẫn đến lỗi. Bạn có thể chọn bất kỳ cuộc gọi nào trong số này và nó sẽ giống như khi bạn chạy lệnh đó ở chế độ browser(): bạn sẽ có thể xem xét các biến trong môi trường gọi điện và xem qua mã.

Thông tin và ví dụ khác tại ?recover.

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