Почему 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(...)))
Другие вопросы по тегам