有没有一种方法可以将具有一系列 grid.* 和视口调用的函数转换为 grob/gTree?

Is there a way to converting a function with a series of grid.* and viewport calls to a grob/gTree?

有没有一种简单的方法可以通过一系列调用 grid.* 函数和视口操作来获取任意函数,例如下面的第一个函数,并取回 gTree/grob 对象,例如生成的对象第二个功能?

我问是因为尝试使用 grid.* 函数逐步创建绘图比使用相当笨拙的语法创建复杂的 gTrees 要容易得多。然而,当你需要在更大的绘图元素或组合图中使用你的绘图时,我倾向于以 gTree 形式使用它们,而不是自己写入绘图设备。

我一直在努力理解 grid 有一段时间了,我觉得即使在深入研究文档之后我还是错过了一些东西,看来必须有一种更简单的创建方法复杂的 gTrees?

library(grid)

plotter <- function(x){
  pushViewport(viewport(gp = gpar(fill = "white", col = "black", lwd = 2)))
  grid.rect(
    width = 0.3, height = 0.8,
    gp = gpar(fill = "red")
  )
}

grid.newpage()
plotter()


plotter2 <- function(x) {
  g <- gTree()
  g <- addGrob(
    g,
    rectGrob(
      width = 0.3, height = 0.8,
      gp = gpar(fill = "red"),
      vp = "vp"
    )
  )
  g$childrenvp <- viewport(name = "vp", gp = gpar(fill = "white", col = "black", lwd = 2))
  g
}

grid.newpage()
grid.draw(plotter2())

grid.grab() 函数允许您在生成它的绘图代码之后调用时将现有绘图捕获为 gTreegrid.grabExpr() 函数允许捕获 gTree 而无需从如下描述它的表达式中绘制它:

library(grid)

plotter <- function(x) {
    grid.grabExpr(expr = {
        pushViewport(viewport(gp = gpar(fill = "white", col = "black", lwd = 2)))
        grid.rect(
            width = 0.3, height = 0.8,
            gp = gpar(fill = "red")
        )
    })
}

grid.newpage()
grid.ls(plotter()) # to see the structure of the gTree
grid.draw(plotter())