r - 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 图的网格有关,但没有解决打印的作用。
解决方案
打印强制对参数 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)
推荐阅读
- typescript - 在打字稿中转换字典中值的类型
- vue.js - 如何使用 vue.js 将值存储在本地存储中
- python-3.x - 熊猫 to_datetime 返回字符串对象
- javascript - ReactJS:已经在上层范围内声明
- python - 如何将多个数据框添加到新数据框中的单个单元格
- facebook-graph-api - Facebook 图形 API 在访问 INSTAGRAM 用户个人资料名称时出错
- .net - 将 xamarine android 程序集 dll 引用添加到 .net 472 时出现错误
- azure - Azure 命令“az keyvault secret list”抛出“[Errno 22] Invalid argument”——如何调试?
- java - Java 中只有最近的任务 ExecutorService
- typo3 - TYPO3 安装我自己的插件后,我得到了一个列表错误