如何正确使用{cli}格式化带.前缀的函数名
cli格式化带.前缀函数名异常的解决方法
问题复现
- 普通无前置
.的函数名,使用cli的{.fn}占位符可以正常输出格式化结果:
fn_name <- "foo" cli::cli_li("My function is {.fn {fn_name}}") #> • My function is `foo()`
- 若函数名带
.前缀,直接在{.fn}内部拼接.和函数名变量,会生成异常输出:
cli::cli_li("My function is {.fn .{fn_name}}") #> • My function is `` .`foo()` ()``
该场景预期输出:
• My function is.foo()``
- 函数名变更提示的通用场景下,错误写法输出如下:
fn_name <- "foo" cli::cli_li("Function name changed from {.fn {fn_name}} to {.fn .{fn_name}}") #> • Function name changed from `foo()` to `` .`foo()` ()``
该场景预期输出:
• Function name changed fromfoo()to.foo()``
正确写法
不要在{.fn}语义占位符内部做字符串拼接,提前将带前缀的完整函数名组装为独立变量,再通过插值传入{.fn}即可得到正确结果:
fn_name <- "foo" # 提前拼接得到完整的带前缀函数名 new_fn <- paste0(".", fn_name) cli::cli_li("Function name changed from {.fn {fn_name}} to {.fn {new_fn}}") #> • Function name changed from `foo()` to `.foo()`
核心原因:cli的语义类格式化占位符会将内部不属于内层胶水插值的内容识别为格式控制标记,在占位符内直接拼接字符会触发解析逻辑错误,所有待格式化的目标内容需要提前组装完成后,再通过插值传入占位符。
内容的提问来源于stack exchange,提问作者Indrajeet Patil
相关产品推荐
相关产品推荐

