首页 > 解决方案 > 带有 purrr::walk 的嵌套循环留下空地块

问题描述

下面的代码生成一个图网格:

library(tidyverse)
library(grid)
library(patchwork)


exdata <- diamonds %>%
  group_by(cut) %>% 
  nest %>% 
  crossing(dummy = 1:3) %>% 
  crossing(cohort = LETTERS[1:3]) %>% 
  mutate(plots = map(.x = data, ~ ggplot(.x, aes(x = x, y = y)) + geom_point()))


# vars for plot grid
mod <- 'Fair'
colsn <- length(unique(exdata$dummy))
rowsn <- length(exdata$cohort %>% unique)

# create plots
wrap_plots(plotlist = exdata %>% filter(cut == mod) %>% pull(plots), ncol = colsn, nrow = rowsn) + plot_annotation(title = " ")

# add some text across columns
walk2(seq(0.165,0.835, length.out = colsn), unique(exdata$dummy), ~ grid.draw(textGrob(.y, x = .x, y = 0.98, rot = 0)))

看起来像这样: 在此处输入图像描述

在那个代码块中,我有一个变量mod <- 'Fair'. 我想让它成为一个向量,并为每种类型的钻石切割生成一个网格。试过:

mods <- exdata$cut %>% unique %>% as.vector

walk(mods, function(.x) {
  wrap_plots(plotlist = exdata %>% filter(cut == .x) %>% pull(plots), ncol = colsn, nrow = rowsn) + plot_annotation(title = " ")
  walk2(seq(0.165,0.835, length.out = colsn), unique(exdata$dummy), ~ grid.draw(textGrob(.y, x = .x, y = 0.98, rot = 0)))
})

此代码似乎运行没有错误,但没有返回所有图。网格本身是,只是没有情节: 在此处输入图像描述

如何运行嵌套的步行循环来为每种类型的切割生成图网格?

标签: rpurrr

解决方案


只需将您的绘图包装在打印语句中即可解决问题

walk(mods, function(.x) {
  print(wrap_plots(plotlist = exdata %>% filter(cut == .x) %>% pull(plots), ncol = colsn, nrow = rowsn) + plot_annotation(title = " "))
  walk2(seq(0.165,0.835, length.out = colsn), unique(exdata$dummy), ~ grid.draw(textGrob(.y, x = .x, y = 0.98, rot = 0)))
})

在此处输入图像描述


推荐阅读