为什么 ggplot 不允许抑制其 geom 生成的消息?

Why does ggplot not allow suppressing of messages generated by its geoms?

ggridges 包中的 geom_density_ridges geom 创建了脊线,如果未指定带宽,它会尝试找到一个合理的值。然后它使用 base R message 函数报告该值(参见 https://twitter.com/ClausWilke/status/921363157553172480)。

base R 函数 suppressMessages 函数旨在抑制此类消息。例如,此代码输出一条消息:

message('This is a message');

这段代码什么也不输出:

suppressMessages(message('This is a message'));

但是,由于某种原因,当将此 geom 添加到 ggplot 时,消息的抑制似乎,嗯,被抑制了。以下代码 仍会产生一条消息:

require('ggplot2');
require('ggridges');
suppressMessages(ggplot(Orange, aes(x=age,y=Tree)) + geom_density_ridges());

(具体来说,“Picking joint bandwidth of 319”。)

这是为什么? ggplot 是否采取措施确保无论用户指定如何传递消息?或者这实际上是我恰好不知道的明智行为?

生成 RMarkdown 报告时,块选项 message 可以设置为 message=FALSE,这会在渲染级别抑制所有消息。因为那是我的用例,我的问题就解决了。

正如 ggridges 软件包的作者 Claus Wilke 所建议的那样,您始终可以手动设置 bandwidth 以避免消息 (https://twitter.com/ClausWilke/status/921361195231215616)。

但是为什么suppressMessages首先抑制消息?

这是我恰好不知道的预期行为吗?

当您调用 ggplot() 时,该命令实际上并没有绘制绘图——它创建了一个 ggplot 对象。只有当该对象被打印时,才会真正绘制出一个图。当您在 R 控制台中键入表达式时,默认行为是对结果调用 print(),这就是为什么看起来 ggplot() 绘制了一个图。

请注意,您遇到的警告不会在创建 ggplot 对象期间出现;它们发生在这个对象的打印过程中。所以如果你 运行

suppressMessages(ggplot(...))

这与

基本相同
print(suppressMessages(ggplot(...)))

当 运行ning R 处于交互模式时。但是由于 ggplot() 没有生成任何消息,因此不会抑制任何内容,并且在打印结果对象时这些消息仍然会出现。要抑制在打印期间创建的消息,您需要用 suppressMessages().

包装实际的 print() 语句
suppressMessages(print(ggplot(...)))