首页 > 解决方案 > R sink() 消息并输出到同一个文件 - 完整性检查

问题描述

我正在使用 R 的 sink() 函数将错误、警告、消息和控制台输出捕获到单个文本文件中。

我想知道同时将消息输出类型下沉到一个打开的文件是否不好?

我将以上所有内容捕获到一个文件中,但我必须打开一个文件句柄以允许捕获两种接收器类型。以下代码说明了使用文件句柄方法:

message_filename = 'script_messages.txt'
try(message_file <- file(message_filename, open="at")) # open file for appending in text mode
sink(message_file, type="message")
sink(message_file, type="output")

cat("\n\n")
message(format(Sys.time(), "%a %b %d %Y %X TZ(%z)"), appendLF = TRUE)
# next line produces messages since file doesn't exist
try(source("import_file.R"), silent = TRUE)

# Save and close writing errors, warnings, messages, and console output to a file
sink(type="output")
sink(type="message")
close(message_file)

如果我不打开文件句柄,则接收器“输出”类型的消息是文本文件中唯一捕获的消息。

sink {base} 上的文档在 Details 部分的前半部分有一些关键信息,但我不够流利,无法确保我已经正确实现了它。

标签: rfileerror-handlingoutputsink

解决方案


我相信这与警告的全局选项有关。默认值是warn=0“在顶级函数返回之前存储警告”。换句话说,当你source("script.R"),R 存储警告并在你的脚本完成后打印它们,即在你运行之后sink(type="output"); sink(type="message"); close(message_file)

要更改此设置,您可以options(warn=1)在获取脚本之前调用,这将在警告发生时打印警告,因此会被您的接收器捕获。这只需要在每个会话中运行一次。


推荐阅读