Почему 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(...)))