14

包中的geom_density_ridges几何图形ggridges创建了山脊线,如果没有指定带宽,它会尝试找到一个合理的值。然后它使用baseRmessage函数报告该值(参见https://twitter.com/ClausWilke/status/921363157553172480)。

baseR 函数suppressMessages函数旨在抑制此类消息。例如,此代码输出一条消息:

message('This is a message');

这段代码什么也不输出:

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

但是,由于某种原因,当将此几何图形添加到 ggplot 时,消息的抑制似乎被抑制了。以下代码仍然会产生一条消息:

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

(具体来说,“ Picking joint bandwidth of 319”。)

为什么是这样?无论用户的规范如何,是否ggplot会采取措施确保消息通过?还是我碰巧不知道这实际上是明智的行为?

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

正如包的作者克劳斯威尔克所ggridges建议的那样,您始终可以bandwidth手动设置 of 以避免消息(https://twitter.com/ClausWilke/status/921361195231215616)。

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

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

4

1 回答 1

10

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

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

suppressMessages(ggplot(...))

这基本上是一样的

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

在交互模式下运行 R 时。但是由于 不生成任何消息ggplot(),因此不会抑制任何消息,并且在打印结果对象时仍然会出现这些消息。要抑制在打印期间创建的消息,您需要将实际print()语句用suppressMessages().

suppressMessages(print(ggplot(...)))
于 2017-10-30T14:00:07.057 回答