我需要更改一个脚本中的所有标签(titlessubtitles),这个脚本创建了近100个不同的图块。我不想改变脚本代码,而是想循环浏览所有的图,并添加一个新的 labs
功能。这样就不会改变原来的任何东西。要做到这一点,我需要把所有的ggplot2对象放到list中。
我的问题是:如何存储所有的 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()
首先收集你所有的 ggplot
环境中的对象。 你可以循环浏览 ls()
并检查每个对象的类中是否有'ggplot'(这对你的例子有效)。
my_ggplot_names=ls()[which(sapply(ls(),function(x) class(get(x))[2]=="ggplot"))]
然后就可以很容易地使用 mget
来收集所有带有这些名字的对象到一个列表中。
my_listed_ggplots=mget(my_ggplot_names)
可能列表中的地块没有名字。
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"