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

如何将tibble列作为参数传入map函数进行引用?

解决tibble多列重复执行分组求和的问题

你遇到的报错是因为calc函数里用了{{x}}这种裸列名语法(tidy eval非标准求值),但map传的是字符串列名,两者不兼容。下面给你几种可行的解决方式:

方法1:修改calc函数兼容字符串列名

把函数里的分组逻辑改成用.data代词引用字符串列名,这样不管传裸列名还是字符串都能正常运行:

library(dplyr)
library(purrr)

df <- tibble(
  g1 = c("A", "A", "B"),
  g2 = c("D", "E", "E"),
  b = c(4,5,6)
)

calc <- function(df, x) {
  df |> 
    group_by(.data[[x]]) |>  # 用.data代词读取字符串列名
    summarise(val = sum(b))
}

# 直接用字符串列表传参给map
map(c("g1", "g2"), ~calc(df, .x))

方法2:不修改原函数,转换字符串为符号

如果不想改calc函数,可以用rlang::sym把字符串转换成裸列名对应的符号,再用!!解引用传入函数:

# 保留你原来的calc函数
calc <- function(df, x) {
  df |> 
    group_by({{x}}) |> 
    summarise(val = sum(b))
}

# 在map里转换字符串为符号
map(c("g1", "g2"), ~calc(df, !!rlang::sym(.x)))

方法3:直接写匿名函数简化代码

如果不需要复用calc函数,也可以直接在map里写匿名逻辑,更简洁:

map(c("g1", "g2"), ~{
  df |> 
    group_by(.data[[.x]]) |> 
    summarise(val = sum(b))
})

以上三种方法都能得到你想要的结果:一个包含两个tibble的列表,分别对应按g1和g2分组求和的结果。

内容的提问来源于stack exchange,提问作者abreums

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 09:02:13