如何在函数中用变量引用非语法列名执行dplyr::select列范围选择?
解决dplyr自定义函数中按非语法列名范围选择列的问题
针对你遇到的问题,这里提供两种可行的解决方案,实现通过变量引用非语法列名来选择列范围:
方法1:接受字符串形式的列名参数
适合需要从变量或外部输入获取列名的场景,通过将字符串转为符号并结合非标准求值实现:
library(dplyr) df <- tibble(a = "a", b = "b", `1` = "c", `2` = "d") g <- function(df, var) { # 将字符串列名转为符号 start_col <- sym(var) # 用!!插入符号,构造列范围选择表达式 select(df, !!start_col:`2`) } # 调用时传入字符串形式的非语法列名 g(df, var = "1")
输出结果:
# A tibble: 1 × 2 `1` `2` <chr> <chr> 1 c d
方法2:使用大括号语法({{}})直接传递非语法列名
适合直接在函数调用中传入带反引号的列名,利用dplyr的大括号语法自动处理非标准求值:
g <- function(df, var) { select(df, {{var}}:`2`) } # 调用时直接传入带反引号的非语法列名 g(df, var = `1`)
原写法问题说明
- 调用
g(df, var=1)选中全部4列:因为数字1被dplyr解析为列的位置索引(第1列),all_of(1):2``等价于从第1列到2列的位置(第4列),因此选中所有列。 - 调用
g(df, var=1)报错:原函数中all_of(var)要求传入字符串/字符向量,但var=1``传入的是符号类型,all_of()无法解析符号,导致报错。
内容的提问来源于stack exchange,提问作者harisf
相关产品推荐
相关产品推荐

