如何让cli::cli_abort()解析动态参数及传入的CLI标记内容?
解决cli::cli_abort未解析传入参数中cli标记的问题
你的问题核心是:传入的msg参数包含cli的格式化标记(比如{.var x}),但cli_abort只是将其作为普通字符串拼接,没有解析这些标记。可以通过以下两种方式解决:
方法一:先解析传入的msg再拼接
使用cli::cli_format()提前解析msg中的cli标记,再将解析后的内容传入cli_abort:
f <- function(msg){ parsed_msg <- cli::cli_format(msg) cli::cli_abort("{parsed_msg} xxx") } f(msg = "{.var x}") # 输出会正确解析{.var x},显示为带样式的变量名x加上xxx
方法二:通过表达式注入传递标记
让msg以表达式形式传入,再用rlang::inject()在cli_abort中注入并解析:
library(rlang) f <- function(msg){ cli::cli_abort(inject("{!!msg} xxx")) } # 调用时直接传入cli标记表达式 f(msg = {.var x}) # 或者用quote包裹 f(msg = quote({.var x}))
原代码失效原因
当你将"{.var x}"作为字符串传给msg后,cli_abort("{msg} xxx")只会把msg的字符串值直接插入模板,不会递归解析其中的cli标记——cli的模板解析仅处理当前字符串内的标记,不会对插入的字符串内容二次解析。
内容的提问来源于stack exchange,提问作者sparklink
相关产品推荐
相关产品推荐

