grid.grab():使用点阵输出时 "wrap" 参数的奇怪行为

grid.grab(): strange behavior of "wrap" argument when working with lattice output

grid.grab() 捕获所有当前视口并将它们存储为 grob。理论上,通常在实践中,您现在可以使用 grid.grab() 存储图像以供以后绘制。但是我注意到在处理点阵输出时 grid.grab() 有一些奇怪的行为。它与wrap参数有关:

  1. wrap = TRUE 时,保存的 grob 应该会生成忠实于原始视口的绘图。但有时不会。
  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)

根据 Paul Murrell 的说法(R Graphics, 第二版,第 239 页),使用 grid.grab(wrap = TRUE) 是 "guaranteed to replicate the original output." 但事实并非如此。具体来说,顶部的水平线(来自 panel.abline(h = 5))不会被再现。

我在 R 3.3.2 和 3.5.1 中 运行 这个例子。在这两种情况下结果都是一样的。这些错误,还是我忽略了什么?

Paul Murrell answered the question 在 R-help 邮件列表中。简而言之,问题的出现是因为,在上面的示例中,代码创建了两个同名的 grob,进而导致 grid.grab() 出现问题。在他的回答中,Paul 建议一种解决方法是命名第二个 grob:替换

panel.abline(h = 5)

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

没有问题。 (我已验证此解决方案有效。)Paul 还指出,即将推出的 grid.grab() 版本将能够更好地处理我上面描述的情况。