为什么 ggplot 不允许抑制其 geom 生成的消息?
Why does ggplot not allow suppressing of messages generated by its geoms?
ggridges
包中的 geom_density_ridges
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
首先抑制消息?
这是我恰好不知道的预期行为吗?
当您调用 ggplot()
时,该命令实际上并没有绘制绘图——它创建了一个 ggplot 对象。只有当该对象被打印时,才会真正绘制出一个图。当您在 R 控制台中键入表达式时,默认行为是对结果调用 print()
,这就是为什么看起来 ggplot()
绘制了一个图。
请注意,您遇到的警告不会在创建 ggplot 对象期间出现;它们发生在这个对象的打印过程中。所以如果你 运行
suppressMessages(ggplot(...))
这与
基本相同
print(suppressMessages(ggplot(...)))
当 运行ning R 处于交互模式时。但是由于 ggplot()
没有生成任何消息,因此不会抑制任何内容,并且在打印结果对象时这些消息仍然会出现。要抑制在打印期间创建的消息,您需要用 suppressMessages()
.
包装实际的 print()
语句
suppressMessages(print(ggplot(...)))
ggridges
包中的 geom_density_ridges
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
首先抑制消息?
这是我恰好不知道的预期行为吗?
当您调用 ggplot()
时,该命令实际上并没有绘制绘图——它创建了一个 ggplot 对象。只有当该对象被打印时,才会真正绘制出一个图。当您在 R 控制台中键入表达式时,默认行为是对结果调用 print()
,这就是为什么看起来 ggplot()
绘制了一个图。
请注意,您遇到的警告不会在创建 ggplot 对象期间出现;它们发生在这个对象的打印过程中。所以如果你 运行
suppressMessages(ggplot(...))
这与
基本相同print(suppressMessages(ggplot(...)))
当 运行ning R 处于交互模式时。但是由于 ggplot()
没有生成任何消息,因此不会抑制任何内容,并且在打印结果对象时这些消息仍然会出现。要抑制在打印期间创建的消息,您需要用 suppressMessages()
.
print()
语句
suppressMessages(print(ggplot(...)))