2015-08-06 11 views
5

Yeterli bellek nedeniyle bir hataya sahip bir kodum var. Aslında büyük bir veri üzerinde doğrusal bir model (lm) yapıyorum. Sorun, hata vermek, günlüğe kaydetmek istediğim, ancak value[[3L]](cond) içerdiği için değil.R'deki değer [[3L]] (koşullu) hatası nedir?

Benim hata şuna benzer:

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

bu (kullanarak günlük lib) gibi bakmak kaydeder kodu: neden Error in value[[3L]](cond): söylediğini

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") 
}) 

Benim sorundur? Yaptığım yanlış bir şey mi var ve bilmiyorum? Sadece Error: <error message> mu olmalı?

+0

Ne? Neden -1? R için yeniyim, eğer kötü bir uygulama yaparsam, söyle bana. Ya da her zaman herhangi bir hatanın önüne geçtiğini gösterirse, bana söyleyin, google hakkında bu konuda büyük bir anlaşma bulamadım (bir hata/uyarı göründüğünde bir sonraki yineleme sorununda ortaya çıkmış olması dışında) – sop

cevap

6

İçsel tryCatch içinde stop() yayımlıyoruz ve içten bir hata koşulu yükseltildiğinde, tryCatch() (tryCatch iç) bir listede üçüncü elementtir sağladığınız hata işleyicisi çağırır. Bu işleyici koşulunu value[[3L]](cond) aracılığıyla iletir. Hata işleyiciniz durduğundan, en son hatanın çağrıldığı yer burasıdır.

Öyle gibi hata işleyicisi çağrı yığını görmek için traceback() (örtük print() der) kullanabilirsiniz:

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

verir ki:

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) 
    }) 

aramayı korumak istiyorsanız orijinal hatadan -stack ama daha bilgilendirici bir hata mesajı var, sadece hatayı düzenleyin ve yeniden yükleyin:

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) 
    })