Как заставить замолчать это конкретное сообщение, записанное в терминал / файл (при вызове Rscript через скрипт bash) - PullRequest
1 голос
/ 27 марта 2019

Я пишу сценарий bash (который будет вызываться из терминала - в системе Linux), который создает файл журнала перед инициацией «rscript» с использованием некоторого простого пользовательского ввода.Однако я сталкиваюсь с проблемами в управлении тем, какие сообщения включены в файл журнала (или отправлены на терминал), и не могу найти никакого решения для исключения одного конкретного сообщения загрузки пакета R:

Пакет WGCNA 1.66 загружен.

Другими словами, мне нужен способ (только) заставить замолчать это конкретное сообщение, которое выводится при успешной загрузке пакета WGCNA.

Я будупостарайтесь, чтобы код был неконкретным, чтобы можно было упростить его выполнение.

Блок ниже представляет собой скелет (исключая некоторый нерелевантный код), и за ним последуют несколько разных вариантов, которые я пробовал.Где изначально я пытался управлять выводом из скрипта R, используя sink () и suppressPackageStartupMessages () , чего, как я думал, должно было быть достаточно.

скрипт 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. Пропустить вызов sink () из сценария R и добавить

&>> $LOG

для вызова bs 'Rscript'.В результате выводится тот же файл, что и выше.

ii. То же, что и i , но замена suppressPackageStartupMessages () на suppressMessages (), что приводит к тому же выводу файла, что и выше.

iii. То же, что и i , но добавлено

... require(thePKG, quietly=TRUE)

вR script # main pkg call , с теми же результатами.

Это потенциальные решения, с которыми я сталкивался и пробовал в разных вариациях без положительных результатов.


Мне также было интересно, был ли пакет WGCNA загружен «вне» цикла! Require thePKG, поскольку на него не влияют suppressMessages () для этого вызова.Но введение преднамеренной ошибки (которая завершила процесс) до вызова if-require (thePKG) удалило сообщение - намекало на его инициацию внутри цикла.Я также попытался вызвать WGCNA самостоятельно в начале сценария R, добавив к нему suppressMessages () , но это тоже не сработало.Функция экспорта, используемая в скрипте bash, не влияет на результат (насколько мне известно), и удаление его расширяет сообщение загрузки, чтобы включить следующее (усеченное для экономии места):

Пакет WGCNA 1.66 загружен.

Важное примечание. Похоже, что ваша система поддерживает многопоточность, но она не включена в WGCNA в R.

Чтобы разрешить многопоточность в WGCNA со всеми доступными ядрами, используйте allowWGCNAThreads() в R. Используйте disableWGCNAThreads (), чтобы отключить многопоточность, если это необходимо.

(...)


Я знаю, что могу отправить вывод (только) в / dev / null, но в файл выводятся другие выходные данные (например,> «Запуск метода»), которые мне все еще нужны.

У кого-нибудь есть предложения по удалению этого сообщения?Я очень новичок в программировании на R и только что начал использовать Linux (Ubuntu LTS), поэтому помните об этом при ответе.

Заранее спасибо.

1 Ответ

0 голосов
/ 28 марта 2019

Я мог бы собрать следующий поток выполнения из вашего вопроса:

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

Для заявленных требований вам могут помочь следующие команды (в bash):

  • grep - Эта команда помогает вам искать шаблоны

  • Pipe (|) - это оператор в 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 -> Это записывает вывод в терминал +, а также перенаправляет его в имя файла журнала, передаваемого в качестве аргумента. Вы можете вообще пропустить эту команду, если она не нужна

...