如何使写入 terminal/file 的特定消息静音(当通过 bash 脚本调用 'Rscript' 时)

How do I silence this specific message written to terminal/file (when calling an 'Rscript' via a bash script)

我正在编写一个 bash 脚本(在 Linux 系统上从终端调用),它在启动 'rscript' 之前创建一个日志文件一些简单的用户输入。然而,我 运行 在控制日志文件中包含哪些消息(或发送到终端)方面遇到了问题,并且找不到任何解决方案来排除一个特定的 R 包加载消息:

Package WGCNA 1.66 loaded.

换句话说,我需要一种方法(仅)静音此特定消息,该消息在成功加载 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)

这不会向终端输出任何内容(这很好),包括日志文件中的以下内容:

Package WGCNA 1.66 loaded.

> Running "method"

Error: added error to verify that it's correctly printed to the file


我想尽可能保持我的日志文件干净和准确(并避免终端混乱),因此希望删除包加载消息。我尝试了以下...

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 脚本中使用的导出函数不会影响结果(据我所知),删除它会扩展加载消息以包含以下内容(截断以保存 space):

Package WGCNA 1.66 loaded.

Important note: It appears that your system supports multi-threading, but it is not enabled within WGCNA in R.

To allow multi-threading within WGCNA with all available cores, use allowWGCNAThreads() within R. Use disableWGCNAThreads() to disable threading if necessary.

(...)


我知道我可以(仅)将输出发送到 /dev/null,但是我仍然需要将其他输出打印到文件(例如 > 运行“方法”)。

有人对如何删除此消息有建议吗?我是 R 编程的新手,刚开始使用 Linux (Ubuntu LTS),所以请在回答时记住这一点。

提前致谢。

我可以从你的问题中收集到以下执行流程:

Bash_Script ----> R_Script ----> Output_to_terminal (and also a log file probably)

对于所述的要求,以下命令(在 bash 中)可以帮助您:

  • grep - 此命令可帮助您搜索形态

  • 管道符 (|) - 这是 Linux 中的一个运算符,可帮助您将一个命令的输出重定向为另一个命令的输入以进行进一步处理(例如 A | B

  • tee - 此命令接受任何输入并将其转发到文件 + 标准输出(终端)

因此,您可以在 bash 文件中混合并匹配上述命令以获得所需的输出:

您可以延长

Rscript ~/path/analysis.R $RDS $DATE $LOG

Rscript ~/path/analysis.R "$RDS" "$DATE" "$LOG" | grep -v "Package WGCNA" | tee "output.log"

每个命令的作用是什么?

a) | -> 这会将前面命令的输出重定向为下一个命令的输入。它更像是一个连接器

b) grep -> 通常用于搜索形态。在这个例子中,我们将它与 -v 选项一起使用来进行反向匹配,即搜索除 Package WGCNA

之外的所有内容

c) tee -> 这会将输出写入终端 + 还将其重定向到日志文件名,作为参数传递。如果不需要,您可以完全跳过此命令