2015-08-06 15 views
5

Tôi có một mã có lỗi vì không đủ bộ nhớ. Trên thực tế tôi làm một mô hình tuyến tính (lm) trên một dữ liệu lớn. Vấn đề không phải là vì nó cho tôi lỗi, mà tôi muốn đăng nhập, nhưng vì nó chứa value[[3L]](cond).Lỗi trong giá trị [[3L]] (cond) trong R là gì?

lỗi của tôi trông như thế này:

Error in value[[3L]](cond): While training model Error: cannot allocate vector of size 6.4 Gb 

Mã mà các bản ghi cho nó trông như thế này (sử dụng khai thác gỗ lib):

tryCatch({ 
    # some code 
    tryCatch({ 
    # some other code 
    }, warning = function(war){ 
    logwarn(war, logger = "MyLogger") 
    }, error = function(err){ 
    stop(paste("While training model", err, sep = " ")) 
    }) 
    some more code 
}, error = function(err){ 
    logerror(err, logger = "MyLogger") 
}) 

Vấn đề của tôi là tại sao nó nói Error in value[[3L]](cond):? Có điều gì đó sai trái mà tôi đã làm và tôi không biết? Không phải chỉ là Error: <error message>?

+0

Cái gì? Tại sao -1? Tôi mới đến R, vì vậy nếu tôi thực hành không tốt, hãy nói cho tôi biết. Hoặc nếu nó luôn cho thấy rằng trước bất kỳ lỗi nào, thì hãy nói cho tôi biết, tôi đã không tìm thấy thỏa thuận lớn trên google về nó (ngoại trừ việc nó xuất hiện trong một vấn đề lặp lại tiếp theo nếu một lỗi/cảnh báo xuất hiện) – sop

Trả lời

6

Bạn đang phát hành stop() trong nội tryCatch của bạn, và trong nội bộ, khi một điều kiện lỗi được nâng lên, tryCatch() gọi là xử lý lỗi mà bạn cung cấp là yếu tố thứ ba trong danh sách (nội bộ để tryCatch). Nó gọi rằng người xử lý đi qua điều kiện cond qua: value[[3L]](cond). Vì trình xử lý lỗi của bạn dừng lại, đó là nơi lỗi gần đây nhất được gọi.

Bạn có thể sử dụng traceback() (mà mặc nhiên gọi print()) để xem các cuộc gọi stack trong xử lý lỗi như vậy:

tryCatch({ 
    stop('') 
},error=function(err){ 
    traceback() 
}) 

trong đó sản lượng:

5: print(where) at #4 
4: value[[3L]](cond) 
3: tryCatchOne(expr, names, parentenv, handlers[[1L]]) 
2: tryCatchList(expr, classes, parentenv, handlers) 
1: tryCatch({ 
     stop() 
    }, error = function(err) { 
     print(where) 
    }) 

Nếu bạn muốn giữ lại các cuộc gọi -stack từ lỗi ban đầu nhưng có thông báo lỗi nhiều thông tin hơn, chỉ cần chỉnh sửa lỗi và nâng cấp lại:

tryCatch({ 
    # some other code 
    }, warning = function(war){ 
    logwarn(war, logger = "MyLogger") 
    }, error = function(err){ 
    # edit the error message 
    err$message <- paste("While training model", err, sep = " ") 
    # and re-raise 
    stop(err) 
    }) 
Các vấn đề liên quan