2016-08-04 15 views
2

anscheinend versuchen und trycatch funktionieren nicht für dieses Problem! Irgendwelche alternativen Lösungen?

Ich versuche, das folgende Beispiel-Code arbeiten, ohne wirklich zu ändern beliebigen CodeR Schleife fortsetzen bei Fehler

result = 0 
for(i in 1:10){ 
    result = result + i 
    log("a") #I do not care about this error 
    result = result + i 
} 

Dieses Ergebnis sollte geben machen = 110

Wenn ich es wirklich tun manuell durch den Teil innerhalb der Schleife zu kopieren und die Zähler zu erhöhen es funktioniert perfekt:

result = 0 

#iteration 1 
i = 1 
result = result + i 
log("a") 
result = result + i 

#iteration 2 
i = i+1 
result = result + i 
log("a") 
result = result + i 

#iteration 3 
i = i+1 
result = result + i 
log("a") 
result = result + i 

#etc. 

aber mein richtiger Code hat etwa 1000 Zeilen und braucht ein paar hundert mal in einer Schleife.

So möchte Ich mag einige Möglichkeit haben

options(on.error.just.continue.the.next.line) = TRUE 

Ich habe gelesen, über try/TryCatch aber ich verstehe es nicht richtig glaube ich

Antwort

3

Wenn Sie nur den Code ausführen möchten Sie können try statt:

result <- 0 
for(i in 1:10){ 
    result = result + i 
    try({log("a")}) #I do not care about this error 
    result = result + i 
} 

Fehler bei log ("a"): nicht-numerische Argument mathematische Funktion
Fehler im Protokoll ("a"): nicht numerisches Argument zur mathematischen Funktion Fehler im Protokoll ("a"): nicht-numerisches Argument zur mathematischen Funktion Fehler im Protokoll ("a"): nicht numerisch Argument zur mathematischen Funktion
Fehler im Protokoll ("a"): nicht numerisches Argument zur mathematischen Funktion
Fehler im Protokoll ("a"): nicht-numerisches Argument zur mathematischen Funktion Fehler im Protokoll ("a") : nicht numerisches Argument zur mathematischen Funktion
Fehler in Protokoll ("a"): nicht numerisches Argument zu mathematischer Funktion
Fehler in Protokoll ("a"): nicht numerisches Argument zu mathematischer Funktion
Fehler bei log ("a"): nicht-numerische Argument mathematische Funktion

result 
[1] 110 

Um die Nachricht zu deaktivieren, verwenden Sie

try({log("a")}, silent=TRUE) 

Wenn Sie über eine besorgt größeren Block des Codes, können Sie es in { } wie folgt einwickeln:

result <- 0 
for(i in 1:10){ 
    try({    # start code block 
    result = result + i 
    log("a")    # I do not care about this error 
    result = result + i 
    }, silent=TRUE)  # end of try function 
} 

result 
[1] 55 

Hier endet die erste Zuweisung zum Ergebnis in der for Schleife. Dann tritt der Fehler auf, der die Ausführung des restlichen Codeblocks "löscht", was hier die zweite Zuweisung ist. Die Ausführung der Schleife kann jedoch bis zum Abschluss fortgesetzt werden.

+0

Und was, wenn über> 100 Teile des Codes möglicherweise schief gehen könnte?Ich möchte nicht try() um jede Codezeile hinzufügen. – Ivo

+0

Kein Problem in einigen Situationen. Ich werde einen Schnitt machen. – lmo

+0

Ok, nicht wirklich die Lösung, die ich suchte, ich finde es seltsam, dass es keine Optionen gibt, es nicht auszulöschen. Vor allem, weil es es ignoriert, wenn ich es manuell auswähle und den Block leite. Aber danke – Ivo

4

Sie können versuchen, einen Versuch catch-Block mit:

result = 0 
for (i in 1:10) { 
    result = result + i 
    tryCatch({ 
     log("a") #I do not care about this error 
    }, warning = function(w) { 
     # comment out the next print statement for a silent warning 
     print("warning") 
    }, error = function(e) { 
     # comment out the next print statement for a silent error 
     print("error") 
    }, finally = { 
     # cleanup 
    } 
    result = result + i 
} 
+0

Und was, wenn über> 100 Teile des Codes möglicherweise schief gehen könnten? Ich möchte nicht try() um jede Codezeile hinzufügen – Ivo

+2

Ich sehe nichts falsch daran, 'try' an mehreren Stellen zu verwenden. Dies wird routinemäßig in objektorientierten Sprachen wie Java, C++ und C# durchgeführt. –

+0

Ich habe etwa hundert Zeilen in Versuch gewickelt, aber mein Code funktioniert immer noch nicht. Muss ich buchstäblich jede Codezeile in try() umbrechen? Das sieht für mich extrem hässlich aus. – Ivo