18

我正在 R 中运行模拟研究。有时,我的模拟研究会产生错误消息。当我在一个函数中实现我的模拟研究时,出现此错误消息时模拟停止。我知道抑制错误是不好的做法,但此时对我来说,除了抑制错误然后继续下一个模拟,直到我喜欢运行的模拟总数为止,别无选择。为此,我必须抑制 R 产生的错误消息。

为此,我尝试了不同的方法:

library(base64)
suppressWarnings
suppressMessages
options(error = expression(NULL))

在前两个选项中,只有警告和消息被禁止,所以没有帮助。如果我理解正确,在最后一种情况下,应该避免所有错误消息。但是,这无济于事,该功能仍会因错误消息而停止。

有人知道为什么这不能按我期望的方式工作吗?我在互联网上搜索了解决方案,但只能找到上述方法。在我运行模拟的函数中,部分代码由外部程序 JAGS(Gibbs 采样器)分析,并由此分析产生错误消息。这可能是它出错的地方吗?

请注意,我不必抑制某个/特定的错误消息,因为没有产生其他错误消息,所以有一个选项可以抑制所有错误消息就足够了。

感谢您的时间和帮助!

4

2 回答 2

12

正如前面的解决方案所建议的,您可以使用tryortryCatch函数,它将封装错误(更多信息在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){})
于 2018-02-16T16:46:57.633 回答
7

抑制消息和抑制对错误的响应之间存在很大差异。如果一个函数不能完成它的任务,它必然会返回一个错误(尽管有些函数有一个命令行参数来在出错的情况下采取一些其他的行动)。正如 Zoonekynd 建议的那样,您需要的是使用trytrycatch“封装”错误,以便即使功能失败,您的主程序流程也可以继续。

于 2013-10-01T11:12:07.963 回答