2015-08-06 3 views
5

Ho un codice che ha un errore a causa della memoria insufficiente. In realtà faccio un modello lineare (lm) su un grande dato. Il problema non è perché mi dà l'errore, che voglio accedere, ma perché contiene value[[3L]](cond).Qual è l'errore nel valore [[3L]] (cond) in R?

Il mio errore è simile al seguente:

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

Il codice che registra apparire come questo (usando lib logging):

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

Il mio problema è il motivo per cui sta dicendo Error in value[[3L]](cond):? È qualcosa di sbagliato che ho fatto e non lo so? Non dovrebbe essere solo Error: <error message>?

+0

Cosa? Perché -1? Sono nuovo di R, quindi se faccio una cattiva pratica, dimmi. O se mostra sempre quello di fronte a qualsiasi errore, quindi dimmi, non ho trovato un grosso problema su google (tranne che è apparso in un problema di andare avanti iterazione se appare un errore/avviso) – sop

risposta

6

si stanno invocando stop() nel vostro interno tryCatch, che internamente, quando una condizione di errore viene generato, tryCatch() chiama il gestore degli errori che hai fornito, che è il terzo elemento in un elenco (interna al tryCatch). Si chiama quella condizione di passaggio handler cond tramite: value[[3L]](cond). Poiché le chiamate del gestore errori si interrompono, è qui che è stato chiamato l'errore più recente.

È possibile utilizzare traceback() (che chiama implicitamente print()) per visualizzare lo stack di chiamate nel gestore di errori in questo modo:

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

che produce:

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

Se si desidera mantenere la chiamata -staccare dall'errore originale ma avere un messaggio di errore più informativo, modificare l'errore e controrilanciare:

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