【问题标题】:suppress messages displayed by "print" instead of "message" or "warning" in R抑制 R 中“打印”而不是“消息”或“警告”显示的消息
【发布时间】:2012-02-06 12:18:29
【问题描述】:

我使用的许多 R 包都涉及通过 print() 调用的命令而不是 message() 或 warning() 的命令来提供所有消息和警告的函数。我希望能够使这些功能进度指示器等静音,但标准的 supressWarnings() 或 supressMessages 不这样做。有没有办法让我抑制打印?

例如:

silly_developer_function <- function(x){
   print("Thanks for using my function!!")
   if(is(x, "numeric"))
     print("warning, x should be a character")
   x
}

我想要一个简单的函数suppressPrint(),我可以围绕调用这个函数来抑制警告和无用的消息(但仍然打印返回值)。

【问题讨论】:

  • 有使用sink的hackish策略,但可能有更好的方法。
  • @cboettig -- 您对 Simon 解决方案的建议编辑很好,但最好将其作为编辑/附录添加到您自己的帖子中。谢谢。
  • @JoshO'Brien 感谢您的指点。那么我是否使用该提案编辑我的原始问题?把问题变成答案似乎很奇怪?
  • @cboettig -- 是的,我就是这样做的(并且经常看到它在 SO 上完成)。您可以引用 Simon Urbanek 作为该想法的来源,并说(本质上)“这就是我对这个想法所做的事情”。

标签: r suppress-warnings


【解决方案1】:

嗯,这些包一开始就有问题。在print 实现中将print() 用于除副作用之外的任何东西是一个严重的错误。

也就是说,您可以简单地使用capture.output() 来收集此类代码的输出,而不是打印它。所以对于上述情况,它会是

capture.output(x <- silly_developer_function(...))
print(x)

【讨论】:

  • 很好的解决方案。我可能会分配 capture.output 的输出以避免打印。同意这是一个解决错误代码的工作,但是在我使用的包中使用 print 而不是 message() 很猖獗,所以你的解决方案非常方便!
  • FWIW 如果您担心控制台上的输出(它会自动添加print(..)),您可以将capture.output 包装在invisible(...) 中
  • 谢谢,这很有用。我在编写循环一些此类函数的 Sweave 小插图时遇到了这个问题,并且 Sweave/knitr 也会自动添加打印。理想情况下,这可以在 Sweave 选项中以消息和警告的方式进行抑制。
  • @SimonUrbanek 感谢您的回答,它帮助了我。我知道这是一个老问题,但是在capture.output 周围添加invisible(...) 会有什么不同?我已经在循环中尝试过这个,但是有和没有invisible 没有明显的区别。 ? 文件没有明确说明它在这种情况下的作用。谢谢
【解决方案2】:

另一种 hacky 方法是覆盖默认的 print 函数。它会影响某些功能,例如打印函数体,但具有自己打印方法的对象仍会照常返回。

print <- function(...) {}

> silly_developer_function("a")
[1] "a"
> silly_developer_function(1)
[1] 1

【讨论】:

  • 这通常不起作用,因为包不一定使用全局命名空间进行函数查找。
  • @SimonUrbanek 啊,没错
猜你喜欢
  • 1970-01-01
  • 2012-02-09
  • 1970-01-01
  • 1970-01-01
  • 2014-08-30
  • 2013-05-14
  • 2020-09-01
  • 1970-01-01
相关资源
最近更新 更多