如何将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
相关产品推荐
相关产品推荐

