问题描述
假设我们运行以下代码:
iris %>%
group_split(Species) %>%
map(~ggplot(.,aes(x = Sepal.Length,y = Sepal.Width))+
geom_point())
这将创建三个单独的散点图,分别是“隔片长度”与“隔片宽度”,并按物种分组。
但是,现在,我想将这三个文件另存为.png。我希望它们被称为setosa.png
,versicolor.png
和virginica.png
。如何在不离开map
“ loop ”的情况下执行此操作?我知道我可以将图表保存在列表中,然后调用for
循环将其保存,但这是我要避免的具体事情。
我想这样开始:
iris %>%
group_split(Species) %>%
map(~ggplot(.,y = Sepal.Width))+
geom_point()) %>%
map(ggsave)
解决方法
在同一map
中执行此操作,而不要添加另一个map
命令。您可以从Species
列中提取first
值来获取文件名。
library(dplyr)
library(ggplot2)
iris %>%
group_split(Species) %>%
purrr::map(~ggsave(paste0(first(.$Species),'.png'),ggplot(.,aes(x = Sepal.Length,y = Sepal.Width))+
geom_point()))
,
这是不用purrr
的另一种方式。但是,它需要创建一个自定义函数:
library(dplyr)
library(ggplot2)
save_plots <- function(df) {
sapply(1:nrow(df),function(v) {ggsave(filename = paste(df$Species[v],"png",sep="."),plot = df$plot[v][[1]],device = "png")})
}
iris %>%
nest_by(Species) %>%
mutate(plot = list(ggplot(data,y = Sepal.Width))+
geom_point())) %>%
save_plots()