使用 `purrr::pwalk` 保存嵌套数据框中列表列中的 ggplots 时出现“未使用的参数”错误

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

我试图从嵌套数据框中的列表列中保存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.```
r ggplot2 purrr
1个回答
3
投票

问题是使用

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

© www.soinside.com 2019 - 2024. All rights reserved.