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

为何expr_text(enquo())在cli中返回波浪号~,与deparse(substitute())不同?

R quosure相关疑问解答

场景代码示例

library(rlang)
library(cli)
my_cli <- function(arg) {
  cli::cli_abort(c(
    "*" = "{.arg {deparse(substitute(arg))}}",
    "*" = "{.arg {expr_text(enquo(arg))}}",
    "*" = "{.arg {expr_text(enexpr(arg))}}"
  ))
}
my_cli(my_arg)
#> Error in `my_cli()`:
#> • `my_arg`
#> • `~my_arg`
#> • `my_arg`
#> Backtrace:
#>     ▆
#>  1. └─global my_cli(my_arg)
#>  2.   └─cli::cli_abort(...)
#>  3.     └─rlang::abort(...)

疑问1:为何expr_text(enquo())返回带波浪号~的结果,而deparse(substitute())无波浪号?

  • substitute(arg)直接提取传入arg的未求值裸表达式(此处为my_arg),deparse()将这个裸表达式转换为普通字符串,因此输出my_arg。
  • enquo(arg)返回的是quosure对象,它包含两部分信息:传入的表达式my_arg,以及该表达式被捕获时的环境。expr_text()处理quosure时,会用波浪号~标记这是绑定了环境的引用式表达式,以此区分普通裸表达式,所以输出~my_arg。

疑问2:quosure的何种特性导致输出出现~my_arg?

quosure的核心特性是表达式与环境的绑定——它不仅保存表达式本身,还记录了表达式所属的环境上下文。expr_text()格式化quosure时,添加波浪号~作为视觉标识,明确提示该表达式并非孤立代码片段,而是携带环境信息的引用对象。这个波浪号是rlang对quosure的标准化表示,直观体现其“带环境的引用”本质。


内容的提问来源于stack exchange,提问作者its.me.adam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 10:25:25