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

如何使用purrr迭代含rlang curly-curly的tidy evaluation函数?

解决curly-curly函数的迭代调用问题

错误原因解析

  1. 直接写c(cyl, vs, am, gear)报错:cyl等是mtcars的列名,并非全局环境中的对象,R会尝试查找全局变量导致找不到。
  2. 传字符串向量报错:{{ by }}(curly-curly语法)默认解析裸变量名,它会把.x当作列名去mtcars中查找,而非.x存储的字符串值(比如"cyl"),因此提示找不到.x列。

解决方案

方案1:转换为符号向量调用

先将列名字符串转为符号对象,再通过!!强制解析符号:

library("dplyr")
library("purrr")
library("rlang")

myfunc <- function(by) {
  mtcars %>% count({{ by }})
}

# 将字符串转为符号列表,再迭代调用
syms(c("cyl", "vs", "am", "gear")) %>% map(~ myfunc(!!.x))

方案2:修改函数兼容字符串输入

用rlang::ensym()将输入统一转为符号,不管传入裸变量还是字符串都能处理:

library("dplyr")
library("purrr")
library("rlang")

myfunc <- function(by) {
  # 将输入转换为符号
  by_sym <- ensym(by)
  mtcars %>% count(!!by_sym)
}

# 直接传字符串向量迭代
c("cyl", "vs", "am", "gear") %>% map(myfunc)

# 也支持裸变量调用
myfunc(cyl)

方案3:使用.data代词直接索引列

如果只需要处理字符串输入,用.data[[by]]直接引用列,无需符号转换:

library("dplyr")
library("purrr")

myfunc <- function(by) {
  mtcars %>% count(.data[[by]])
}

# 传字符串向量迭代
c("cyl", "vs", "am", "gear") %>% map(myfunc)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 23:21:22