将环境中的所有 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)
我需要更改脚本中的所有标签 (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)