首页 > 解决方案 > ggplot列表值根据打印变化

问题描述

这是我遇到的问题的简化版本:

grob.list <- vector("list", length = 2)
for (i in 1:2) { 
  grob.list[[i]] <- qplot(1:5, 1:5 * (-1)^i)
}

grid.arrange(grobs = grob.list)

我们得到两个相同的图(grob.list[[1]]是错误的)。

如果我们打印(甚至是不可见的)grobs 会正确显示。

grob.list <- vector("list", length = 2)
for (i in 1:2) { 
  grob.list[[i]] <- qplot(1:5, 1:5 * (-1)^i)
  invisible(print(grob.list[[i]]))
}

grid.arrange(grobs = grob.list)

那么打印是否会强制 ggplot 对象“定居”?打印 ggplot 对象实际上会改变它什么?

似乎与在 for 循环中制作的多个 ggplot2 图的网格有关,但没有解决打印的作用。

标签: rggplot2

解决方案


打印强制对参数 i 进行评估,否则 R 的惰性评估会延迟查找它的值,直到绘图渲染时间,此时它只是 2。

一种选择是force()在函数中使用:

plot.g <- function(i) {
    force(i)
    qplot(1:5, 1:5 * (-1)^i)
}

grob.list <- vector("list", length = 2)
for (i in 1:2) { 
    grob.list[[i]] <- plot.g(i)
}

grid.arrange(grobs = grob.list)

...或lapply在现代版本的 R 中使用 which 将强制对参数进行评估i

l <- lapply(1:2,function(i) qplot(1:5, 1:5 * (-1)^i))

grid.arrange(grobs = l)

推荐阅读