如何在R函数中实现多变量数据框排序且不使用三点参数
解决R函数多变量排序(支持desc)的问题
你的代码无法正常运行的核心原因是:当你用c(desc(a), b)作为sort_vars传入时,c()会将两个表达式合并成一个向量,而非保留它们作为独立的排序逻辑表达式。enquos()捕获的是整个c()调用,arrange()无法正确解析这个向量作为排序条件。
正确实现方式
这里提供两种符合需求的实现方案:
方案1:使用...直接传递排序表达式
这种方式最贴近dplyr::arrange()的原生用法,支持直接传入带desc()的排序条件:
library(tidyverse) library(rlang) dummy_df <- tibble(a = c(1, 1, 2), b = c("bac", "abc", "cba")) arrange_df <- function(data, ...) { # 捕获所有传入的排序表达式 sort_exprs <- enquos(...) data %>% arrange(!!!sort_exprs) } # 调用示例 arrange_df(dummy_df, desc(a), b)
方案2:通过sort_vars参数传递表达式列表
如果你希望明确使用sort_vars参数,可以让它接收一个表达式列表(用list()包裹而非c()):
arrange_df <- function(data, sort_vars) { # 捕获传入的列表表达式 sort_exprs <- enexprs(sort_vars)[[1]] # 去掉list()调用,提取内部的排序表达式 sort_exprs <- sort_exprs[-1] data %>% arrange(!!!sort_exprs) } # 调用示例 arrange_df(dummy_df, sort_vars = list(desc(a), b))
验证结果
两种方案的输出都与预期一致:
# # A tibble: 3 × 2 # a b # <dbl> <chr> # 1 2 cba # 2 1 abc # 3 1 bac
内容的提问来源于stack exchange,提问作者Tjark van de Merwe
相关产品推荐
相关产品推荐

