2017-11-25 44 views
7

Tôi có một số câu hỏi về purrr :: pmap để tạo nhiều ô ggplot trong nested.data.frame.Cách sử dụng purrr :: pmap để vẽ nhiều ggplot trong nested.data.frame

Tôi có thể chạy bên dưới mã mà không gặp sự cố bằng cách sử dụng purrr :: map2 và tôi có thể tạo số nhân (2 ô) trong nested.data.frame.

Như một ví dụ, tôi đã sử dụng iris bộ dữ liệu trong 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))) 

Nhưng, khi tôi muốn âm mưu hơn 2 lô, tôi không thể giải quyết bằng purrr :: pmap như dưới đây mã.

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 

Có cách nào giải quyết vấn đề này trong nested.data.frame không? Vui lòng cho tôi một số lời khuyên hoặc câu trả lời.

Trả lời

8

purrr::pmap mất (ít nhất) hai đối số:

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

nơi

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

Hơn nữa, .x.y làm việc tốt cho chỉ có hai đối số, nhưng (trong cùng một trang man) nó nói For more arguments, use '..1', '..2', '..3' etc.

Để dễ đọc (và một chút hiệu quả), tôi sẽ kết hợp tất cả các cuộc gọi riêng lẻ thành mutate thành một; bạn có thể giữ chúng riêng biệt nếu cần (đặc biệt nếu có nhiều mã hơn bạn hiển thị trong ví dụ đã được rút gọn này):

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

Cảm ơn câu trả lời nhanh! Tôi có thể giải quyết vấn đề của tôi! Tôi đã bỏ qua purrr :: pmap cần danh sách các danh sách. Cảm ơn. –

+1

Nếu nó giải quyết được vấn đề của bạn, vui lòng "chấp nhận" nó bằng cách chọn dấu kiểm ở bên trái câu trả lời. – r2evans

Các vấn đề liên quan