我在 for 循环中生成各种图并将它们存储在列表中。这个想法是脚本的用户只需要提供一个数据框,脚本会自动为该数据框的每一列执行条形图。问题是我使用的是动态代码,所以如果循环的每个步骤的环境没有存储在列表中,那么当我调用列表的每个元素时,我总是得到相同的图(对应于最后一列数据框的。
这是一个测试数据框:
test<-data.frame(color=c('blue', 'blue', 'red', 'red', 'yellow', 'green', 'green', 'green'),
fruit=c('apple', 'apple', 'apple', 'apple', 'banana', 'banana', 'blueberry', 'orange'),
letter=c('A', 'A', 'A', 'A', 'A','B','C','C'))
这里是我正在尝试做的循环:
plotList<-list()
for (i in 1:ncol(test)){
varName<-colnames(test)[i]
newPlot<-ggplot(data=test,aes(x=test[,varName]))+
geom_bar()
plotList[[i]]<-newPlot
}
问题是我在打印
plotList[[1]]
、plotList[[2]]
或plotList[[3]]
时总是得到相同的情节
我也考虑过使用 apply,但在我的真实脚本中,我必须在 for 循环中创建一些中间数据帧,所以它不是那么简单。我也试过
recordplot()
但是没有用。你知道是否有一种方法不仅可以将绘图存储在列表中,还可以将创建绘图的步骤中的环境存储起来?
另一个选项可以使用
!!
和 sym
来使用你引用的变量 varName 像这样:
plotList<-list()
library(ggplot2)
for (i in 1:ncol(test)){
varName<-colnames(test)[i]
newPlot<-ggplot(data=test,aes(x=!!sym(varName)))+
geom_bar()
plotList[[i]]<-newPlot
}
plotList
#> [[1]]
#>
#> [[2]]
#>
#> [[3]]
创建于 2023-03-28 与 reprex v2.0.2
请查看本章准报价