如何实现无需引号即可创建字符串向量的R函数?
实现类似dplyr::select的无引号列名转字符向量功能
我明白你想要的是像dplyr的select函数那样,不用给列名加引号就能传入参数,最终返回这些列名组成的字符向量,而不是对数据集做子集化。这里有两种靠谱的实现方式,你可以根据需求选择:
方法一:用base R实现(轻量无依赖)
如果只是需要简单的无引号列名转向量,用base R的match.call就能搞定,不需要额外安装任何包:
var_select <- function(...) { # 获取传入的所有参数,去掉第一个(函数名本身)后转成字符向量 as.character(match.call()[-1]) }
测试一下效果:
vector <- var_select(cyl, disp, hp) vector #> [1] "cyl" "disp" "hp"
方法二:用rlang包实现(支持dplyr风格选择器)
如果之后想扩展支持starts_with()、ends_with()这类dplyr常用的选择器,那用rlang包的函数会更贴合dplyr的逻辑,扩展性更强:
library(rlang) library(purrr) # 用于批量处理quosure对象 var_select <- function(...) { # 捕获所有传入的无引号参数为quosure对象 selected_quos <- enquos(...) # 把每个quosure转换成对应的字符名称 map_chr(selected_quos, quo_name) }
同样测试功能:
vector <- var_select(cyl, disp, hp) vector #> [1] "cyl" "disp" "hp"
后续如果想支持复杂选择器(比如var_select(starts_with("c"), hp)),只需要结合dplyr::select_vars就能快速实现,和dplyr的使用体验完全一致。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

