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软件包的作者Claus Wilke 建议的那样,您可以随时bandwidth手动设置以避免消息(https://twitter.com/ClausWilke/status/921361195231215616).
但为什么不suppressMessages首先压制消息呢?
我恰好不知道这种预期的行为吗?
当你调用时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)