You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用字符串为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 11:15:03