【发布时间】:2019-03-27 17:13:51
【问题描述】:
我正在编写一个 bash 脚本(在 Linux 系统上从终端调用),该脚本在使用一些简单的用户输入启动“rscript”之前创建一个日志文件。但是,我在控制日志文件中包含哪些消息(或发送到终端)时遇到了问题,并且找不到任何解决方案来排除一个特定的 R 包加载消息:
已加载 WGCNA 1.66 包。
换句话说,我需要一种方法来(仅)使该特定消息静音,该消息在成功加载 WGCNA 包时打印。
我会尽量保持代码的非特定性,希望它更容易理解。
下面的块是一个骨架(不包括一些不相关的代码),后面会跟着我尝试过的一些不同的变体。在哪里,最初我尝试使用 sink() 和 suppressPackageStartupMessages() 控制 R 脚本的输出,我认为这应该足够了。
bash 脚本:
#!/usr/bin/env bash
read RDS
DATE=`date +%F-%R`
LOG=~/path/log/$DATE.log
touch $LOG
export ALLOW_WGCNA_THREADS=4
Rscript ~/path/analysis.R $RDS $DATE $LOG
R 脚本:
#!/usr/bin R
# object set-up
rds.path <- "~/path/data/"
temp.path <- "~/path/temp/"
pp.data <- readRDS(paste0(rds.path, commandArgs(T)[1]))
file.date <- paste0(commandArgs(T)[2], "_")
# set up error logging
log.file <- file(commandArgs(T)[3], open="a")
sink(log.file, append=TRUE, type="message")
sink(log.file, append=TRUE, type="output")
# main pkg call
if(suppressPackageStartupMessages(!require(thePKG))){
stop("\nPlease follow the below link to install the requested package (thePKG) with relevant dependencies\n https://link.address")
}
# thePKG method call
cat("> Running "method"\n", append=TRUE)
module <- method(thePKG_input = pp.data, ppi_network = ppi_network)
# reset sink and close file connection
sink(type="message")
sink(type="output")
close(log.file)
这不会向终端输出任何内容(这很好),包括日志文件中的以下内容:
已加载 WGCNA 1.66 包。
> 运行“方法”
错误:添加错误以验证它是否正确打印到文件中
我想保持我的日志文件尽可能干净和准确(并避免终端混乱),因此希望删除包加载消息。我已经尝试了以下...
i. 从 R 脚本中省略 sink() 调用,并添加
&>> $LOG
到 bash 'Rscript' 调用。导致与上面相同的文件输出。
ii. 与 i 相同,但将 suppressPackageStartupMessages() 替换为 suppressMessages(),结果是与上面相同的文件输出。
iii.与i相同,但添加了
... require(thePKG, quietly=TRUE)
在 R 脚本中# main pkg call,结果相同。
这些是我遇到的潜在解决方案,并尝试了不同的变体,但没有积极的结果。
我还想知道 WGCNA 包是否在 PKG 的 !require 循环“外部”加载,因为它不受该调用的 suppressMessages() 影响。但是,在 if-require(thePKG) 调用之前引入一个故意的错误(终止了进程)删除了消息——暗示它在循环内启动。 我还尝试在 R 脚本的开头单独调用 WGCNA,并在其中添加了 suppressMessages(),但这也不起作用。 bash 脚本中使用的导出函数不会影响结果(据我所知),删除它会扩展加载消息以包含以下内容(截断以节省空间):
已加载 WGCNA 1.66 包。
重要提示:您的系统似乎支持多线程,但在 R 的 WGCNA 中未启用。
要在 WGCNA 中允许所有可用内核的多线程,请在 R 中使用 allowWGCNAThreads()。如有必要,请使用 disableWGCNAThreads() 禁用线程。
(...)
我知道我可以(仅)将输出发送到 /dev/null,但我仍然想要其他输出打印到文件(例如 > 运行“方法”)。
有人对如何删除此消息有建议吗?我是 R 编程的新手,刚开始使用 Linux (Ubuntu LTS),所以在回答时请记住这一点。
提前致谢。
【问题讨论】:
标签: r bash file-io error-logging