R: Подавить базовый графический график, но вернуть график как объект - PullRequest
1 голос
/ 21 марта 2019

У меня есть функция, которая возвращает статистику и строит график, используя основную графику R. Я хочу запретить построение графиков из этой функции и вместо этого вернуть график как объект, чтобы можно было управлять графиком или нет извне функции.

Я пробовал:

Используя пакет gridGraphics, я могу преобразовать базовый графический график в объект, как предложено в этом вопросе :

plot(1:10)
grid.echo()
a = grid.grab()
grid.draw(a)

Остается проблема в том, что команда plot() рисует график, который я хочу подавить. Таким образом, я попытался подавить его, печатая на устройстве во временном файле, как ответ здесь предлагает. Код становится:

ff = tempfile()
svg(filename = ff)
plot(1:10)
grid.echo()
a = grid.grab()
dev.off()
unlink(ff)

но теперь, grid.echo() не может найти графику для эха и выдает предупреждение:

Warning message:
In grid.echo.recordedplot(recordPlot(), newpage, prefix, device) :
  No graphics to replay

Я проследил эту проблему до grid.echo(), когда я не мог выводить графику с других устройств, кроме устройства по умолчанию Rstudio, независимо от того, находится он во временном файле или нет. Это само по себе странно, поскольку grid.echo() docs говорит, что оно отображает графику с текущего устройства, не упоминая никаких ограничений.

Может ли кто-нибудь помочь мне решить проблему подавления базового графического сюжета и вернуть его как объект, либо предложив, как исправить мою неудачную попытку, либо другим способом?

1 Ответ

0 голосов
/ 25 марта 2019

LocoGris решил проблему в этом связанном вопросе о поведении grid.echo.

Следующий код будет отображать нежелательный графический вывод в временном файле, сохраняя график как объект сетки, используя grid.echo и grid.grab, перед тем как отсоединить временный файл, так что останется только объект графика, создавая тем самым поведение с привязкой:

ff = tempfile()
svg(filename = ff)
plotfun <- function() plot(1:10)
grid.echo(plotfun)
a = grid.grab()
dev.off()
unlink(ff)

Отличие от рассматриваемого кода в том, что построение графиков в базовой графике R помещается в функцию и передается в grid.echo вместо того, чтобы полагаться на grid.echo для автоматического поиска того, что ему нужно от текущего устройства.

Потенциально полезное примечание: grid.echo будет отображаться два раза, что можно увидеть, если использовать обычный svg() без временных файлов, поскольку два файла появятся с одним графиком. Я предполагаю, что первый график представлен в R базовой графике, а второй - в виде эха с использованием системы координат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...