grid.grab (): странное поведение аргумента «обтекание» при работе с выходом решетки - PullRequest
0 голосов
/ 26 октября 2018

grid.grab() захватывает все текущие области просмотра и сохраняет их в виде гроба.Теоретически, и часто на практике, вы можете использовать grid.grab(), чтобы сохранить изображение для последующего рисования.Но я заметил странное поведение grid.grab() при работе с выходом решетки.Это связано с аргументом wrap:

  1. Когда wrap = TRUE, сохраненный гроб должен создать рисунок, верный исходным областям просмотра.Но иногда это не так.
  2. Даже при использовании wrap = TRUE, grid.grab() предупреждает меня о необходимости использования wrap = TRUE.

Вот минимальный пример, иллюстрирующий эти действия:

library(grid)
library(lattice)
xyplot(1:5 ~ 1:5)
trellis.focus()
panel.abline(h = 3)
panel.abline(h = 5)
myGrob <- grid.grab(wrap = TRUE)

В этот момент я получаю предупреждение -

In grabDL(warn, wrap, ...) :
  one of more grobs overwritten (grab WILL not be faithful; try 'wrap = TRUE')

- что странно, учитывая, что я указал wrap = TRUE.

Я продолжаю работать

grid.newpage()
grid.draw(myGrob)

По словам Пола Меррелла ( R Graphics, 2nd ed., Стр. 239), использование grid.grab(wrap = TRUE) "гарантированно копирует исходный вывод".Но это не так.В частности, верхняя горизонтальная линия (от panel.abline(h = 5)) не воспроизводится.

Я запускал этот пример в R 3.3.2 и 3.5.1.Это получается одинаково в обоих случаях.Это ошибки или я что-то упускаю?

1 Ответ

0 голосов
/ 31 октября 2018

Пол Меррелл ответил на вопрос в списке рассылки R-help.Короче говоря, проблема возникает из-за того, что в приведенном выше примере код создает два гроба с одинаковыми именами, что, в свою очередь, вызывает проблемы с grid.grab().В своем ответе Пол предполагает, что одним из способов решения этой проблемы является присвоение имени второму гробу: замените

panel.abline(h = 5)

на

panel.abline(h = 5, identifier = "abline2")

и проблем не будет.(Я проверил, что это решение работает.) Пол также отмечает, что будущая версия grid.grab() будет лучше обрабатывать случаи, подобные описанному выше.

...