Почему ggplot не позволяет подавлять сообщения, генерируемые его geoms?
geom_density_ridges
Geom от ggridges
Пакет создан ridgelines, и если пропускная способность не указана, он пытается найти разумное значение. Затем он использует base
р 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
пакет, предложенный, вы всегда можете установить bandwidth
вручную, чтобы избежать сообщения ( https://twitter.com/ClausWilke/status/921361195231215616).
Но почему нет suppressMessages
подавить сообщение в первую очередь?
Это ожидаемое поведение, о котором я просто не знаю?
1 ответ
Когда вы звоните ggplot()
эта команда на самом деле не рисует график - она создает объект ggplot. Только когда этот объект напечатан, график фактически рисуется. Когда вы набираете выражение в консоли R, поведение по умолчанию заключается в вызове print()
на результат, поэтому кажется ggplot()
рисует сюжет
Обратите внимание, что предупреждения, которые вы получаете, не появляются во время создания объекта ggplot; они происходят во время печати этого объекта. Так что если вы бежите
suppressMessages(ggplot(...))
это по сути то же самое, что
print(suppressMessages(ggplot(...)))
при запуске R в интерактивном режиме. Но так как сообщения не генерируются ggplot()
, ничего не подавляется, и эти сообщения все еще появляются, когда результирующий объект печатается. Для подавления сообщений, созданных во время печати, необходимо обернуть print()
заявление с suppressMessages()
,
suppressMessages(print(ggplot(...)))