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

Mat*_*ion 11 r ggplot2 r-markdown ggridges

包中的geom_density_ridgesgeom ggridges创建了脊线,如果没有指定带宽,它会尝试找到合理的值.然后使用baseR message函数报告该值(请参阅https://twitter.com/ClausWilke/status/921363157553172480).

base一个R函数suppressMessages功能被设计为抑制这样的消息.例如,此代码输出一条消息:

message('This is a message');
Run Code Online (Sandbox Code Playgroud)

这段代码什么都没输出:

suppressMessages(message('This is a message'));
Run Code Online (Sandbox Code Playgroud)

但是,出于某种原因,当将这个geom添加到ggplot时,抑制消息似乎被抑制了.下面的代码仍然会产生一条消息:

require('ggplot2');
require('ggridges');
suppressMessages(ggplot(Orange, aes(x=age,y=Tree)) + geom_density_ridges());
Run Code Online (Sandbox Code Playgroud)

(具体来说," Picking joint bandwidth of 319".)

为什么是这样?ggplot无论用户的规格如何,是否确实能够确保消息传递?或者这实际上是我刚才不知道的明智行为?

生成RMarkdown报告时,message可以将chunk选项设置为message=FALSE,这将抑制呈现级别的所有消息.因为那是我的用例,我的问题就解决了.

正如该ggridges软件包的作者C​​laus Wilke 建议的那样,您可以随时bandwidth手动设置以避免消息(https://twitter.com/ClausWilke/status/921361195231215616).

为什么suppressMessages首先压制消息呢?

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

MrF*_*ick 6

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

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

suppressMessages(ggplot(...))
Run Code Online (Sandbox Code Playgroud)

这与...基本相同

print(suppressMessages(ggplot(...)))
Run Code Online (Sandbox Code Playgroud)

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

suppressMessages(print(ggplot(...)))
Run Code Online (Sandbox Code Playgroud)