在R中抑制错误信息

21

我正在使用R进行模拟研究。偶尔会出现错误信息。由于我将模拟研究实现在一个函数中,因此当出现错误消息时,模拟就会停止。我知道抑制错误是不好的做法,但目前对我来说没有其他选择,只能抑制错误,然后继续下一个模拟,直到我想要运行的总模拟次数。为了做到这一点,我必须抑制R产生的错误消息。

为了做到这点,我尝试了不同的方法:

library(base64)
suppressWarnings
suppressMessages
options(error = expression(NULL))
在前两种选项中,仅警告和消息被禁止,所以这没有帮助。如果我理解正确,在最后一种情况下,应该避免所有错误消息。但是,这并没有帮助,该函数仍会停止并显示错误消息。
有人有任何想法,为什么它不能按照我的期望工作吗?我在互联网上搜索了解决方案,但只能找到上述方法。在我运行模拟的功能中,代码的一部分由外部程序JAGS(Gibbs取样器)进行分析,并且错误消息由此分析产生。这可能是出错的地方吗?
请注意,我不必压制某个/特定的错误消息,因为没有其他错误消息产生,只需有一个可以禁止所有错误消息的选项即可。
感谢您的时间和帮助!

谢谢你的快速回答。我尝试使用try(simulation(x,y,z))(括号内是我的自定义函数),但也不起作用。我还尝试使用options(show.error.messages = FALSE),但没有成功。 - Inga
如果您不向我们展示您的代码或具体错误,我们如何能够提供帮助呢? - Carl Witthoft
2个回答

16

如前一解决方案所建议的,您可以使用trytryCatch函数,它们将封装错误(有关更多信息,请参见Advanced R)。但是,默认情况下,它们不会抑制将错误报告消息发送到stderr

可以通过设置其参数来实现此目标。对于try,设置silent=TRUE。对于tryCatch,设置error=function(e){}

示例:

o <- try(1 + "a")
>  Error in 1 + "a" : non-numeric argument to binary operator
o <- try(1 + "a", silent=TRUE)  # no error printed

o <- tryCatch(1 + "a")
> Error in 1 + "a" : non-numeric argument to binary operator
o <- tryCatch(1 + "a", error=function(e){})

7

抑制消息和抑制错误响应之间存在很大的区别。如果函数无法完成其任务,它必然会返回一个错误(尽管某些函数具有命令行参数,在出现错误时执行其他操作)。正如Zoonekynd建议的那样,您需要使用trytrycatch来“封装”错误,以便即使函数失败,您的主程序流也能够继续运行。


1
感谢您的回复。我没有提供我的代码,因为它包含一个在for循环中调用另一个源中的函数的函数,因此代码非常长。此外,正如Carl Witthoft的答案所表明的那样,我的问题是一个误解:我认为我尝试的选项和函数(见上文)应该抑制对错误的响应。最终,对我有用的是使用try()调用发生错误的函数,然后从我调用该函数的for循环中使用下一个选项。 - Inga
@Inga:我有相同或类似的问题,但是我无法理解你的解决方案。如果您能提供一个最简示例来说明您的解决方案,那就太好了。 - giordano
1
当然。我在一个for循环中调用了一个函数-N-次。该函数进行了分析(JAGS),但有时会出现错误。为了防止这种情况,我将for循环调整为以下形式: for (i in 1:N){ results[[i]] <- try(Jags.Analysis(Npairs = Npairs...)if(class(results[[i]]) == "try-error") next - Inga
我没有意识到你只能在5分钟内编辑你的回复。代码的作用不是防止错误,而是使R不跳出for循环,而是在发生错误时从下一个迭代开始。因此,在N = 5次的for循环中,错误发生3次,只有2个分析结果将被保存。如果由于缺乏格式(或其他原因)语法不清楚,请告诉我! - Inga
2
@Carl Witthoft: 在我的情况下,我会将错误打印到屏幕上,但是一切都运行正常(确实是一个非常奇怪的情况)。我能否以某种方式抑制这些错误,就像我可以通过options(warn = -1)抑制警告一样?我希望有像options(err = -1)这样的命令或类似的东西!这将有助于抑制消息,但不一定是响应。注意:对我来说,既不是options(error = expression(NULL)),也不是suppressMessages起作用。 - warship
@warship 没有看到你的代码,无法确定发生了什么。你可能想要发布一个新问题来描述你的具体问题,并提供一些可重现的代码和数据。 - Carl Witthoft

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接