如何将ggplot的环境存储到列表中?

问题描述 投票:0回答:1

我在 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()
但是没有用。你知道是否有一种方法不仅可以将绘图存储在列表中,还可以将创建绘图的步骤中的环境存储起来?

r ggplot2
1个回答
0
投票

另一个选项可以使用

!!
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


请查看本章准报价

© www.soinside.com 2019 - 2024. All rights reserved.