从列表中调整grobs的大小时,获得" Value的分配必须是一个单位"错误

时间:2018-04-12 22:54:24

标签: r gtable grob

我试图有效地调整grobs以制作出版质量图。我在上下文中反复遇到同样的错误,我使用Stack Overflow答案中提供的代码,并且该代码似乎涉及(我认为)使用列表形式的grob。

这是一个自包含的示例,取自对前一个堆栈溢出问题(底部链接)的一个很好的答案:

library(grid)
library(gridExtra)
library(ggplot2)

morletPlots <- replicate(5, ggplot(), simplify = FALSE)
rawplot <- replicate(5, ggplot(), simplify = FALSE)

glets <- lapply(morletPlots, ggplotGrob)
graws <- lapply(rawplot, ggplotGrob)

rawlet <- function(raw, let, heights=c(4,1)){
  g <- rbind(let, raw)
  panels <- g$layout[grepl("panel", g$layout$name), ]
  #  g$heights <- grid:::unit.list(g$heights) # not needed
  g$heights[unique(panels$t)] <- lapply(heights, unit, "null")
  g
}

combined <- mapply(rawlet, raw = graws, let=glets, SIMPLIFY = FALSE)

grid.newpage()
grid.arrange(grobs=combined, ncol=2)

当我尝试运行时,我得到:

  

[<-.unit*tmp*,唯一(面板$ t),值=列表(4,1))出错:    分配的值必须是单位

在尝试使这个(和类似的代码)工作时我做错了什么?

取自baptiste对this question

的回答的例子

1 个答案:

答案 0 :(得分:1)

某些代码可能会及时更改。对象的类在进程中搞砸了。这有效:

library(grid)
library(gridExtra)
library(ggplot2)

morletPlots <- replicate(5, ggplot(), simplify = FALSE)
rawplot <- replicate(5, ggplot(), simplify = FALSE)

glets <- lapply(morletPlots, gta)
graws <- lapply(rawplot, ggplotGrob)

rawlet <- function(raw, let, heights=c(4,1)){
  g      <- gtable_rbind(let, raw)
  panels <- g$layout[grepl("panel", g$layout$name), ]
  g$heights[unique(panels$t)] <- unit(heights, units = "null")
  g
}

combined <- mapply(rawlet, raw=graws, let=glets, SIMPLIFY = F)

grid.newpage()
grid.arrange(grobs=combined)

某些代码可能会及时更改。对象的类在过程中搞砸了。