2017-11-25 93 views
7

Mam kilka pytań o purrr :: pmap, aby utworzyć wiele wątków ggplot w nested.data.frame.Jak używać purrr :: pmap do drukowania wielu ggplot w nested.data.frame

Mogę uruchomić poniższy kod bez problemu za pomocą polecenia purrr :: map2 i mogę utworzyć multiplots (2 działki) w nested.data.frame.

Jako przykład użyłem zestawu danych Iris 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))) 

Ale gdy chcę wykreślić więcej niż 2 działki, nie można rozwiązać za pomocą Purrr :: pmap jak poniżej kodu.

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 

Czy istnieje sposób rozwiązania tego problemu w nested.data.frame? Proszę, udziel mi rad i odpowiedzi.

Odpowiedz

8

purrr::pmap zajmuje (co najmniej) dwóch argumentów:

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

gdzie

.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. 

Ponadto .x i .y działa dobrze tylko dwa argumenty, ale (na tej samej stronie człowieka) mówi For more arguments, use '..1', '..2', '..3' etc.

Dla czytelności (i małej wydajności), połączę wszystkie indywidualne połączenia z numerem mutate w jeden; w razie potrzeby możesz je zachować oddzielnie (szczególnie, jeśli kod jest większy niż w tym zredukowanym przykładzie):

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)) 
) 
+0

Dziękuję za szybkie odpowiedzi! Mogę rozwiązać mój problem! Przeoczyłem listę list potrzeb purrr :: pmap. Dzięki. –

+1

Jeśli to rozwiąże problem, proszę "zaakceptować" go, zaznaczając znacznik wyboru po lewej stronie odpowiedzi. – r2evans

Powiązane problemy