Почему ggplot не позволяет подавлять сообщения, созданные его геомами?

Геометрия geom_density_ridges из пакета ggridges создала ridgelines, и если полоса пропускания не указана, она пытается найти разумное значение. Затем он использует функцию base R message, чтобы сообщить об этом значении (см. https://twitter.com/ClausWilke/status/921363157553172480).

Функция base R функция 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 опция chunk 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(...)))