来自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
首先压制消息?
这种我恰好不知道的预期行为吗?
答案 0 :(得分:5)
当你调用ggplot()
时,该命令实际上并没有绘制图 - 它会创建一个ggplot对象。只有在打印该对象时才会绘制实际绘图。在R控制台中键入表达式时,默认行为是在结果上调用print()
,这就是ggplot()
似乎绘制图的原因。
请注意,在创建ggplot对象期间不会出现您遇到的警告;它们在打印此对象期间发生。所以,如果你运行
suppressMessages(ggplot(...))
与
基本相同print(suppressMessages(ggplot(...)))
在交互模式下运行R时。但由于ggplot()
没有生成任何消息,因此不会抑制任何消息,并且在打印结果对象时仍会显示这些消息。要禁止在打印期间创建的消息,您需要使用print()
包装实际的suppressMessages()
语句。
suppressMessages(print(ggplot(...)))