【问题标题】:ggplot list value changes based on printingggplot列表值根据打印变化
【发布时间】:2019-03-06 20:25:05
【问题描述】:

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

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 对象实际上对它有什么影响?

似乎与Grid of multiple ggplot2 plots which have been made in a for loop 相关,但没有说明打印的作用。

【问题讨论】:

  • printing 强制评估参数 i,否则 R 的惰性评估会延迟查找它的值,直到绘图渲染时间,此时它只是 2。添加行 force(i) 作为问题的原始版本中plot.g 的第一行将解决它。
  • 在这种情况下,lapply 实际上会为您执行参数强制:l &lt;- lapply(1:2,function(i) qplot(1:5, 1:5 * (-1)^i))
  • @joran 你能发帖回答吗?

标签: r ggplot2


【解决方案1】:

打印会强制对参数 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 中将强制评估参数i

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

grid.arrange(grobs = l)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-25
    • 1970-01-01
    • 2023-02-21
    • 2021-05-07
    • 2022-12-06
    • 1970-01-01
    相关资源
    最近更新 更多