我对purrr :: pmap有一些疑问,以便在nested.data.frame中绘制ggplot的多个图。

我可以使用purrr :: map2在代码下面运行,并且可以在nested.data.frame中制作多图(2个图)。

例如,我在R中使用了虹膜数据集。

library(tidyverse)

iris0 <- iris
iris0 <-
iris0 %>%
group_by(Species) %>%
nest() %>%
mutate(gg1 = purrr::map(data, ~ ggplot(., aes(Sepal.Length, Sepal.Width)) + geom_point())) %>%
mutate(gg2 = purrr::map(data, ~ ggplot(., aes(Sepal.Length, Petal.Width)) + geom_point())) %>%
mutate(g = purrr::map2(gg1, gg2, ~ gridExtra::grid.arrange(.x, .y)))


但是,当我要绘制两个以上的图时,无法像下面的代码一样使用purrr :: pmap进行求解。

iris0 <-
iris0 %>%
group_by(Species) %>%
nest() %>%
mutate(gg1 = purrr::map(data, ~ ggplot(., aes(Sepal.Length, Sepal.Width)) + geom_point())) %>%
mutate(gg2 = purrr::map(data, ~ ggplot(., aes(Sepal.Length, Petal.Width)) + geom_point())) %>%
mutate(gg3 = purrr::map(data, ~ ggplot(., aes(Sepal.Length, Petal.Length)) + geom_point())) %>%
mutate(g = purrr::pmap(gg1, gg2,gg3, ~ gridExtra::grid.arrange(.x, .y, .z)))

> Error in mutate_impl(.data, dots) : Index 1 is not a length 1 vector


在nested.data.frame中有没有解决此问题的方法?
请给我一些建议或答案。

最佳答案

purrr::pmap接受(至少)两个参数:

 pmap(.l, .f, ...)


哪里

  .l: A list of lists. The length of '.l' determines the number of
      arguments that '.f' will be called with. List names will be
      used if present.
  .f: A function, formula, or atomic vector.


此外,.x.y仅适用于两个参数,但是(在同一手册页中)它表示For more arguments, use '..1', '..2', '..3' etc

为了提高可读性(并提高效率),我将对mutate的所有单个调用组合为一个;您可以根据需要将它们分开(特别是如果代码比在此简化示例中显示的更多):

library(dplyr)
library(tidyr)
library(purrr)
library(ggplot2)
iris0 <- iris %>%
  group_by(Species) %>%
  nest() %>%
  mutate(
    gg1 = purrr::map(data, ~ ggplot(., aes(Sepal.Length, Sepal.Width)) + geom_point()),
    gg2 = purrr::map(data, ~ ggplot(., aes(Sepal.Length, Petal.Width)) + geom_point()),
    gg3 = purrr::map(data, ~ ggplot(., aes(Sepal.Length, Petal.Length)) + geom_point()),
    g = purrr::pmap(list(gg1, gg2, gg3), ~ gridExtra::grid.arrange(..1, ..2, ..3))
  )

关于r - 如何使用purrr::pmap在nested.data.frame中绘制多个ggplot,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47482288/

10-10 05:21