2017-10-20 120 views
10

geom_density_ridges包中的包创建了棱线,如果没有指定带宽,它会尝试找到合理的值。然后使用base R message函数报告该值(请参阅https://twitter.com/ClausWilke/status/921363157553172480)。为什么ggplot不允许抑制由它的geoms生成的消息?

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

message('This is a message'); 

而这种代码输出什么:

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

然而,出于某种原因,消息的抑制似乎,嗯,抑制当这GEOM被添加到一个ggplot。下面的代码仍然产生消息:(具体地, “Picking joint bandwidth of 319”)

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

这是为什么? ggplot是否做了一些事情来确保消息通过,而不管用户的规格如何?或者这实际上是我刚才不知道的明智行为?

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

而且作为ggridges包的作者Claus Wilke建议,您始终可以手动设置bandwidth以避免该消息(https://twitter.com/ClausWilke/status/921361195231215616)。

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

这是我刚刚碰巧不知道的预期行为吗?

+0

我它规定的文件中注意到'suppressMessages评估其表达在忽略所有的“简单”的诊断messages.'一个方面,我不知道的关键术语这里是*简单* ... – Lyngbakr

+4

如果你手动调用'print',而不是让解释器为你处理,然后'suppressMessages'确实抑制消息。 'suppressMessages(print(ggplot(Orange,aes(x = age,y = Tree))+ geom_density_ridges()))'有一次,我更好地理解了这个过程(消息如何传递以及如何使用suppressMessages以及所有这些)但我早已遗忘了一些细节,所以期待着解释“为什么”的实际回应。 – Dason

+4

@Dason我想你明白了。只有在对象上调用print()后才会生成消息。如果你只是在R控制台中输入一个变量,R隐式地调用该对象上的print()并显示结果。如果你运行'supressMessages(ggplot(...))',这与'print(supressMessages(ggplot(...)))'是一样的,并且在构建过程中不会生成消息。您需要'supressMessages(print(ggplot(...)))'在打印过程中使这些消音。 – MrFlick

回答

3

当您致电ggplot()时,该命令实际上不绘制一个绘图 - 它会创建一个ggplot对象。只有打印该对象时才会绘制一个实际绘制的图形。当您在R控制台中键入表达式时,默认行为是对结果调用print(),这就是为什么它看起来像ggplot()绘制一个图。

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

suppressMessages(ggplot(...)) 

这是基本相同

print(suppressMessages(ggplot(...))) 
运行在交互模式v当

。但是由于ggplot()没有生成消息,所以没有任何东西被抑制,并且当打印结果对象时这些消息仍然出现。要抑制在打印期间创建的消息,您需要用suppressMessages()包装实际的print()声明。

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