2016-08-04 150 views
2

显然尝试和trycatch不起作用的这个问题!任何替代方案?

我试图让下面的示例代码的工作,而无需实际更改任何代码R继续循环出错

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

这应该给结果= 110

如果我真的做手工复制循环内的部分并增加计数器它完美的作品:

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. 

但是我真正的代码有1000行,并且需要循环数百倍。

所以我想有一些选项

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

我读过有关尝试/ tryCatch,但我不明白它正确,我认为

回答

3

如果你只是想代码运行在日志( “A”)

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

错误:你可以使用try代替非数值参数数学函数数学函数的非数字参数
日志(“a”)中的错误:非数字函数的错误(“a”):数学函数的非数字参数
参数对数的数学函数
错误(“A”):非数字参数的数学函数
错误日志(“A”):非数字参数的数学函数
错误日志(“a”)的:数学函数的非数字参数
日志(“a”)中的错误:数学函数的非数字参数
log(“a”)中的错误:数学函数0的非数字参数 错误日志( “A”):非数值参数数学函数

result 
[1] 110 

要关闭的消息,使用

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

如果你是担心较大的代码块,您可以将其包装在{ }中,如下所示:

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 

这里,在for循环中完成第一个赋值。然后发生错误,“擦除”代码块的其余部分的执行,这是这里的第二个任务。但是,循环执行允许继续完成。

+0

而如果约> 100份的代码可能出问题?我不想在每行代码中添加try() – Ivo

+0

在某些情况下不存在问题。我会做一个编辑。 – lmo

+0

好的,不是真正的解决方案,我发现奇怪的是,没有选择不会消除它。特别是因为它在我手动选择并运行该块时忽略它。但是,谢谢 – Ivo

4

您可以尝试使用try catch块:

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

如果大于100个代码可能出错,该怎么办?我不想在每行代码中添加try() – Ivo

+2

在多处使用'try'我看不出任何错误。这通常是用像Java,C++和C#这样的面向对象的语言完成的。 –

+0

我已经在尝试中包装了大约几百行代码,但我的代码仍然无法使用。我是否真的需要在try()中包装每行代码?这对我来说看起来非常难看。 – Ivo