我试图从嵌套数据框中的列表列中保存ggplots,并在文件名中使用嵌套变量,以便我知道哪个图对应于哪个数据。
我使用的方法适用于从嵌套数据帧保存 csv 文件,但不适用于 ggplot 对象。
data("mtcars")
temp_dir <- tempfile()
dir.create(temp_dir)
library(tidyr) # for nest function
plot_fun <- function(x){
p <- ggplot(data = x, aes(x = wt, y = mpg)) +
geom_point()
return(p)
}
cyl_mtcars <- mtcars %>%
nest(data = -cyl) %>%
mutate(plots = map(.x = data, .f = plot_fun)
)
head(cyl_mtcars)
产生
# A tibble: 3 × 3
cyl data plots
<dbl> <list> <list>
1 6 <tibble [7 × 10]> <gg>
2 4 <tibble [11 × 10]> <gg>
3 8 <tibble [14 × 10]> <gg>
但是当我尝试保存数字时
cyl_mtcars %>%
pwalk(
function(cyl, plots) ggsave(filename = file.path(temp_dir, glue("{cyl}.png")), plot = plots)
)
我收到此错误
Error in `pmap()` at purrr/R/pmap.R:148:2:
ℹ In index: 1.
Caused by error in `.f()`:
! unused argument (data = .l[[2]][[i]])
Run `rlang::last_trace()` to see where the error occurred.```
问题是使用
pwalk
或 pmap
所有列都会传递给函数。由于您的函数只有两个参数,因此您会收到“未使用的参数”错误,因为您的嵌套数据具有三列。要解决这个问题,您可以将 ...
添加到函数参数中:temp_dir <- tempfile()
dir.create(temp_dir)
library(tidyverse)
plot_fun <- function(x) {
ggplot(data = x, aes(x = wt, y = mpg)) +
geom_point()
}
cyl_mtcars <- mtcars %>%
nest(data = -cyl) %>%
mutate(plots = map(.x = data, .f = plot_fun))
cyl_mtcars %>%
pwalk(
function(cyl, plots, ...) {
ggsave(filename = file.path(temp_dir, glue::glue("{cyl}.png")), plot = plots)
}
)
#> Saving 7 x 5 in image
#> Saving 7 x 5 in image
#> Saving 7 x 5 in image