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

时间:2017-10-20 13:54:45

标签: r ggplot2 r-markdown ggridges

来自geom_density_ridges包的ggridges 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首先压制消息?

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

1 个答案:

答案 0 :(得分:5)

当你调用ggplot()时,该命令实际上并没有绘制图 - 它会创建一个ggplot对象。只有在打印该对象时才会绘制实际绘图。在R控制台中键入表达式时,默认行为是在结果上调用print(),这就是ggplot()似乎绘制图的原因。

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

suppressMessages(ggplot(...))

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

在交互模式下运行R时。但由于ggplot()没有生成任何消息,因此不会抑制任何消息,并且在打印结果对象时仍会显示这些消息。要禁止在打印期间创建的消息,您需要使用print()包装实际的suppressMessages()语句。

suppressMessages(print(ggplot(...)))