You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R中使用map函数批量绘制数据框多变量的箱线图?

解决purrr::map批量生成箱线图的pull函数错误问题

问题背景

已编写make_plot函数可单独生成箱线图,但用tidyverse的map批量处理var1、var2时,出现错误:no applicable method for 'pull' applied to an object of class 'list'。

错误原因

  1. map调用逻辑错误:原代码mydf %>% map(vars, make_plot)中,map会遍历mydf的每一列(data.frame本质是列组成的集合),将列作为第一个参数传给make_plot,与函数要求的(data, var)参数顺序完全不符。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 11:56:32