【问题标题】:Suppress error message in R抑制 R 中的错​​误消息
【发布时间】:2013-10-07 08:43:03
【问题描述】:

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

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

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

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

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

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

感谢您的时间和帮助!

【问题讨论】:

  • 感谢您的快速回答。我使用了 try(simulation(x,y,z)) (括号中是我自己的函数),但这也不起作用。我还使用了 options(show.error.messages = FALSE) 没有成功。
  • 如果您不向我们展示您的代码或确切的错误,我们如何提供帮助?

标签: r error-handling


【解决方案1】:

如上一个解决方案所建议的,您可以使用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){})

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 感谢您的回复。我没有提供我的代码,因为它包含一个函数,该函数在 for 循环中从源调用另一个函数,因此代码很长。此外,正如 Carl Witthoft 的回答中所清楚的那样,我的问题是一个误解:我认为我尝试的选项和功能(见上文)应该抑制对错误的 响应。最后,对我有用的是使用 try() 调用发生错误的函数,然后在我调用该函数的 for 循环中使用下一个选项。
    • @Inga:我有相同或类似的问题,但我无法找到您的解决方案。如果您为您的解决方案提供一个最小的示例,那就太好了。
    • 当然。我在for循环中调用了一个函数-N-次。该函数进行了分析 (JAGS),但有时会发生错误。为了防止这种情况,我调整了这样的 for 循环: for (i in 1:N){ results[[i]]
    • 我没有意识到您只能在 5 分钟内编辑您的回复。代码所做的不是防止错误,而是让 R 不会跳出 for 循环,而是在错误发生时从下一次迭代开始。所以当在N = 5次的for循环中出现3次错误时,只会保存2次分析的结果。如果由于缺少格式(或其他原因)导致语法不清楚,请告诉我!
    • @Carl Witthoft:就我而言,我将错误打印到屏幕上,但一切运行良好(是的,确实是一个很奇怪的情况)。我能否以某种方式抑制这些错误,类似于我如何使用options(warn = -1) 抑制警告?我希望有像options(err = -1) 命令或类似的东西!这将有助于抑制 消息,但不一定是响应。 注意:options(error = expression(NULL))suppressMessages 都不适合我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多