Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使写入终端/文件的特定消息静音(通过bash脚本调用';Rscript';时)_R_Bash_File Io_Error Logging - Fatal编程技术网

如何使写入终端/文件的特定消息静音(通过bash脚本调用';Rscript';时)

如何使写入终端/文件的特定消息静音(通过bash脚本调用';Rscript';时),r,bash,file-io,error-logging,R,Bash,File Io,Error Logging,我正在编写一个bash脚本(在Linux系统上从终端调用),它在使用一些简单的用户输入启动“rscript”之前创建一个日志文件。但是,我在控制日志文件中包含的消息(或发送到终端的消息)时遇到问题,无法找到排除一个特定R包加载消息的解决方案: 包装WGCNA 1.66已加载 换句话说,我需要一种方法(仅)使此特定消息静音,当WGCNA包成功加载时打印此消息 我会尽量保持代码的非特定性,希望它更容易遵循 下面的代码块是一个框架(不包括一些不相关的代码),后面是我尝试过的一些不同的变体。其中,最初我

我正在编写一个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
#!/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)
R脚本

#!/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
#!/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)
到bash'Rscript'调用。产生与上述相同的文件输出

ii.i相同,但用suppressMessages()替换suppressPackageStartupMessages(),这将产生与上述相同的文件输出

iii.i相同,但增加了

... require(thePKG, quietly=TRUE)
在R脚本#main pkg调用中,使用相同的结果

这些都是我遇到的潜在解决方案,并尝试了不同的变化,但没有积极的结果


我还想知道WGCNA包是否加载到了“外部”!由于该调用不受suppressMessages()的影响,因此需要Pkg的循环。但是,在if-require(thePKG)调用之前引入一个故意错误(该错误终止了进程)会删除该消息,这意味着该消息在循环内部启动。 我还尝试在R脚本开始时单独调用WGCNA,并在其中添加了suppressMessages(),但这也不起作用。 据我所知,bash脚本中使用的导出函数不会影响结果,删除它会扩展加载消息以包括以下内容(截断以节省空间):

包装WGCNA 1.66已加载

重要提示:您的系统似乎支持多线程,但在R中的WGCNA中未启用该功能

要允许WGCNA中具有所有可用内核的多线程,请在R中使用allowWGCNAThreads()。必要时使用disableWGCNAThreads()禁用线程

(……)


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

是否有人对如何删除此邮件有建议?我对R语言编程非常陌生,刚开始使用Linux(UbuntuLTS),所以回答时请记住这一点

提前感谢。

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

Bash\u脚本
--->
R\u脚本
--->
输出到\u终端(可能还有一个日志文件)

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

  • -此命令帮助您搜索模式

  • Pipe(|)-这是Linux中的一个操作符,它可以帮助您将一个命令的输出作为输入重定向到另一个命令,以便进一步处理(例如
    A | B

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

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

你可以延长

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

每个命令的作用是什么?

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

b)
grep
->通常用于搜索模式。在本例中,我们将其与
-v
选项一起使用,以进行反向匹配,即搜索除
Package WGCNA

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

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

Bash\u脚本
--->
R\u脚本
--->
输出到\u终端(可能还有一个日志文件)

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

  • -此命令帮助您搜索模式

  • Pipe(|)-这是Linux中的一个操作符,它可以帮助您将一个命令的输出作为输入重定向到另一个命令,以便进一步处理(例如
    A | B

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

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

你可以延长

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

每个命令的作用是什么?

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

b)
grep
->通常用于搜索模式。在本例中,我们将其与
-v
选项一起使用,以进行反向匹配,即搜索除
Package WGCNA


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

您可以始终使用
-E
(对于regex)或表达式组合来进一步扩展grep,以便对过滤部分有更多的控制,如果需要的问题是添加到消息中的“美学字符”(我在原始问题中没有包括)。'='和“*”被添加到文本框中,并被删除