如何重定向来自rlang::inform的输出?

编程语言 2026-07-12

基本上和标题说的一样。再补充一点背景信息:CRAN给出的指导建议让包使用 rlang::inform()rlang::abort()rlang::warn() 来为用户输出结果,而不是像 print()cat() 这样的函数,因为用户更容易屏蔽或抑制这些命令的输出。不过,我似乎无法 sink() 这些命令的输出(在运行单元测试、调试等场景下会很有用)。交互式地:

> library(rlang)
> HelloWorld <- function() {
+   rlang::inform(message="Hello, World!")
+ }
>
> sink(file="Sunk.txt", type="output")
> HelloWorld()
Hello, World!
> sink()

文件 Sunk.txt 已创建,但为空,而我原本希望其中包含 "Hello, World!"。相反地:

> HelloWorld2 <- function() {
+   print("Hello, World!")
+ }
>
> sink(file="Sunk.txt", type="output")
> HelloWorld2()
> sink()

这里 HelloWorld2 的输出被重定向到了 Sunk.txt

你能帮我理解(1)为什么 rlang 函数的提示信息会以这种方式表现,以及(2)是否有通过 sink()(或其他函数)来重定向它们的输出的方法?(我想避免得到告知不要在这个问题中使用这些 rlang 函数的回答,但关于这类话题的讨论也是欢迎的。)

更新:

看到 type 选项后,我尝试了这个:

> sink(file="Sunk.txt", type="message")

但收到了错误:in sink(file = "Sunk.txt", : 'file' must be NULL or an already open connection

不过,按照帮助文件中对 sink() 的示例操作,我得到了期望的行为:

> fout <- file("Sunk.txt", open="wt")
> sink(fout)
> sink(fout, type="message")
> HelloWorld()
> sink()

现在我的文件中包含了预期的文本。虽然感觉有点绕,我也希望理解为何 rlang 函数需要这些额外步骤。

解决方案

我更倾向于使用base提供的函数。 但你也许需要重新思考在使用rlang::inform时如何组织消息的方式。因为那里已经有一些对输出进行重定向的支持。

> rlang::inform(message="Hello, World!",.file="Sunk.txt")
> args(rlang::inform)
function (message = NULL, class = NULL, ..., body = NULL, footer = NULL, 
    parent = NULL, use_cli_format = NULL, .inherit = NULL, .file = NULL, 
    .frequency = c("always", "regularly", "once"), .frequency_id = NULL, 
    .subclass = deprecated()) 
NULL
>
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章