如何使用字符串为dplyr::arrange的desc()指定排序变量
差异原因解析
核心区别是rlang::expr()和str2lang()对输入内容的处理逻辑完全不同:
rlang::expr()的功能是原样捕获用户输入的表达式,你传入的是字符串字面量"desc(hp)",它返回的结果就是值为"desc(hp)"的字符类型对象。你用!!将其注入到dplyr::arrange()中时,dplyr拿到的是一个所有行都相同的常量字符串,不会触发任何排序逻辑,最终输出就是mtcars数据集的原始顺序,和你看到的错误结果一致。
你可以执行下面的代码验证返回类型:
> class(rlang::expr("desc(hp)")) [1] "character"
str2lang()的功能是将字符串解析为R可执行的语言对象,你传入"desc(hp)"时,它会把这个字符串转换成desc(hp)调用对象,用!!注入到arrange后,dplyr会正常执行按hp列降序排序的逻辑,结果符合预期。
对应类型验证代码:
> class(str2lang("desc(hp)")) [1] "call"
如果你希望用rlang生态的函数实现同样效果,可以用rlang::parse_expr()替代rlang::expr(),它的功能和str2lang()一致,都是将字符串解析为调用对象:
result = dplyr::arrange( mtcars, !! rlang::parse_expr("desc(hp)") )
内容的提问来源于stack exchange,提问作者toshi-san
相关产品推荐
相关产品推荐

