R语言filter函数如何识别自定义函数内捕获的...首个参数名dot_first
问题原因
你拿到的dot_first是字符串格式的列名,dplyr的整洁求值(tidy eval)规则下,!!操作符无法直接将字符串识别为数据框的列对象,需要先完成类型转换再注入表达式。
解决方法
有两种常用的可行方案:
方案1:将字符串转为符号后注入
用rlang::sym()把字符串类型的列名转为符号对象,再用!!注入filter表达式即可。
方案2:用.data代词索引列(更推荐)
直接通过dplyr内置的.data代词按字符串索引列,不需要额外处理符号转换,也能避免环境变量冲突问题,写法更简洁。
修改后的完整代码
library(tidyverse) library(rlang) foo <- function(...){ dots <- rlang::list2(...) dot_first <- names(dots)[1] dat <- expand_grid(...) dat %>% # 方案1写法 # filter(!!sym(dot_first) != 1) # 方案2写法 filter(.data[[dot_first]] != 1) } foo(study = 1:2, test = LETTERS[1:2])
运行后输出结果符合预期,会过滤掉首个参数列值为1的行,最终返回2行数据:
# A tibble: 2 × 2 study test <int> <chr> 1 2 A 2 2 B
内容的提问来源于stack exchange,提问作者Simon Harmel
相关产品推荐
相关产品推荐

