如何使用purrr迭代含rlang curly-curly的tidy evaluation函数?
解决curly-curly函数的迭代调用问题
错误原因解析
- 直接写
c(cyl, vs, am, gear)报错:cyl等是mtcars的列名,并非全局环境中的对象,R会尝试查找全局变量导致找不到。 - 传字符串向量报错:
{{ 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
相关产品推荐
相关产品推荐

