如何在R中使用map函数批量绘制数据框多变量的箱线图?
解决purrr::map批量生成箱线图的pull函数错误问题
问题背景
已编写make_plot函数可单独生成箱线图,但用tidyverse的map批量处理var1、var2时,出现错误:no applicable method for 'pull' applied to an object of class 'list'。
错误原因
- map调用逻辑错误:原代码
mydf %>% map(vars, make_plot)中,map会遍历mydf的每一列(data.frame本质是列组成的集合),将列作为第一个参数传给make_plot,与函数要求的(data, var)参数顺序完全不符。 - pull函数误用:
pull(plots)是错误操作——pull仅用于从data.frame提取列,而map返回的是list,且此时plots尚未赋值,逻辑颠倒。
可行解决方案
方案一:保留原函数,用符号转换适配字符变量
原函数使用{{var}}的非标准求值,需将字符串变量转换为符号后传入:
library(tidyverse) # 原数据与函数 mydf <- data.frame("category" = as.factor(sample(c("type1", "type2"), 10, replace = TRUE)), "var1" = runif(10, min = 0, max = 100), "var2" = runif(10, min = 50, max = 150)) make_plot <- function(data, var) { data %>% ggplot() + aes(x = .data$category, y = {{var}}, color = .data$category) + geom_boxplot(width = 0.2, notch = FALSE, position = position_dodge(1), lwd = 1.8, outlier.shape = NA) } # 批量生成绘图对象 vars <- c("var1", "var2") plots <- map(vars, ~make_plot(mydf, !!sym(.x))) # 批量打印所有图 walk(plots, print)
方案二:修改函数直接支持字符串变量
调整函数用.data[[var]]引用字符串变量,调用更简洁:
library(tidyverse) mydf <- data.frame("category" = as.factor(sample(c("type1", "type2"), 10, replace = TRUE)), "var1" = runif(10, min = 0, max = 100), "var2" = runif(10, min = 50, max = 150)) # 修改后的绘图函数 make_plot <- function(data, var) { data %>% ggplot() + aes(x = .data$category, y = .data[[var]], color = .data$category) + geom_boxplot(width = 0.2, notch = FALSE, position = position_dodge(1), lwd = 1.8, outlier.shape = NA) } # 批量生成并打印 vars <- c("var1", "var2") plots <- map(vars, make_plot, data = mydf) walk(plots, print)
内容的提问来源于stack exchange,提问作者marcel
相关产品推荐
相关产品推荐

