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
首先抑制消息?
这是我刚刚碰巧不知道的预期行为吗?
我它规定的文件中注意到'suppressMessages评估其表达在忽略所有的“简单”的诊断messages.'一个方面,我不知道的关键术语这里是*简单* ... – Lyngbakr
如果你手动调用'print',而不是让解释器为你处理,然后'suppressMessages'确实抑制消息。 'suppressMessages(print(ggplot(Orange,aes(x = age,y = Tree))+ geom_density_ridges()))'有一次,我更好地理解了这个过程(消息如何传递以及如何使用suppressMessages以及所有这些)但我早已遗忘了一些细节,所以期待着解释“为什么”的实际回应。 – Dason
@Dason我想你明白了。只有在对象上调用print()后才会生成消息。如果你只是在R控制台中输入一个变量,R隐式地调用该对象上的print()并显示结果。如果你运行'supressMessages(ggplot(...))',这与'print(supressMessages(ggplot(...)))'是一样的,并且在构建过程中不会生成消息。您需要'supressMessages(print(ggplot(...)))'在打印过程中使这些消音。 – MrFlick