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

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

我需要更改一个脚本中的所有标签(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()
r list ggplot2 environment
1个回答
1
投票

首先收集你所有的 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)

0
投票

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

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" 
© www.soinside.com 2019 - 2024. All rights reserved.