将环境中的所有 ggplot2 图存储在列表中

Store all ggplot2 plots from environment in a list

我需要更改脚本中的所有标签 (titles/subtitles),该脚本创建了将近 10000 个图——全都不同。我不想更改脚本代码,而是想遍历所有绘图并添加一个新的 labs 函数。这样一来,原始内容没有任何改变。为此,我需要将所有 ggplot2 对象放入列表中。

我的问题是:如何将环境中的所有 ggplot2 个对象存储到一个列表中?

下面的代码应该创建 11 个 ggplot2 绘图并将它们存储在环境中(想要执行相反的操作.. 从环境中将它们放入列表中)。

library(tidyverse)

# Make a lot of ggplots using mtcars

all_plots <- list()

all_plots <- map(names(mtcars), 
    possibly(function(x){
  mtcars %>% 
    ggplot(aes(mpg, x))+
    geom_point()
}, NULL)) %>% 
  set_names(names(mtcars))

# function to add all ggplots to the environemnt
list_environment <- function(x) {
  if(is.list(x)) { 
    list2env(x, envir = .GlobalEnv)
    lapply(x, test)
  }
}

list_environment(all_plots)

ls()

可能列表中的地块没有名称。

library(ggplot2)
all_plots <- replicate(10, 
                       ggplot(mtcars[sample(1:nrow(mtcars), 10),], aes(y=mpg, x=hp)) +
                         geom_point(),
                       simplify=F)

这个列表没有名字,

names(all_plots)
# NULL

list2env 将不起作用。

list2env(all_plots, envir=.GlobalEnv)
# Error in list2env(all_plots, envir = .GlobalEnv) : 
#   names(x) must be a character vector of the same length as x

当我们使用 setNames 命名列表对象时有效。

all_plots <- setNames(all_plots, sprintf("p%s", seq(all_plots)))
list2env(all_plots, envir=.GlobalEnv)
ls()
# [1] "all_plots" "p1"        "p10"       "p2"        "p3"       
# [6] "p4"        "p5"        "p6"        "p7"        "p8"       
# [11] "p9" 

首先收集环境中所有 ggplot 对象的名称。您可以遍历 ls() 并检查每个对象的 class 中是否有 'ggplot'(这适用于您的示例):

my_ggplot_names=ls()[which(sapply(ls(),function(x) class(get(x))[2]=="ggplot"))]

然后很容易使用mget将具有这些名称的所有对象收集到一个列表中:

my_listed_ggplots=mget(my_ggplot_names)