Подавлять сообщения запуска при загрузке библиотеки в кластер снегопада с помощью sfLibrary - PullRequest
0 голосов
/ 14 января 2020

Пример кода, который я запускаю ниже.

library(snowfall)
library(snow)

sfInit(parallel = TRUE, cpus = 3)

sfLibrary(raster)
Library raster loaded.
Library raster loaded in cluster.

Я хочу остановить sfLibrary от печати сообщений. Я не могу понять, как. Помогите пожалуйста ...

Спасибо.

РЕДАКТИРОВАТЬ 1: Это не работает:

suppressMessages (sfLibrary (растр))

Загружен растр библиотеки.

РЕДАКТИРОВАТЬ 2: Это не работает:

suppressPackageStartupMessages (sfLibrary (растр))

Загружен растр библиотеки.

Загружен растр библиотеки в кластере.

1 Ответ

3 голосов
/ 14 января 2020

Использовать источник.

Если вы посмотрите на исходный код для sfLibrary, особенно там, где он печатает эти сообщения , вы увидите, что это использует sfCat. Отслеживая это ( тот же файл ), он использует cat.

Я знаю два способа предотвратить сброс cat на консоль: capture.output и sink.

  1. capture.output: "вычисляет свои аргументы с выводом, возвращаемым в виде строки символов или отправляемым в файл" .

    cat("quux4\n")
    # quux4
    invisible(capture.output(cat("quux5\n")))
    cat("quux6\n")
    # quux6
    

    Поскольку capture.output возвращает захваченный вывод видимым образом как вектор character, заключая его в invisible или сохраняя возвращаемое значение в переменную (которая игнорируется и / или удалено) будет препятствовать его выводу на консоль.

  2. sink: «отправить вывод R в файл» .

    cat("quux1\n")
    # quux1
    sink("ignore_me.txt")
    cat("quux2\n")
    sink(NULL) # remove the sink
    cat("quux3\n")
    # quux3
    

Лично я считаю, что использование sink (в целом) сопряжено с некоторыми рисками, особенно в области автоматизации. Хорошим примером является то, что knitr использует sink при захвате вывода для фрагментов кода; у вложенных звонков на sink есть проблемы. Проницательный читатель заметит, что capture.output использует sink, поэтому ни один из них не лучше в этом отношении.

Снова глядя на источник (первая ссылка выше),

else {
  ## Load message in slave logs.
  sfCat( paste( "Library", .sfPars$package, "loaded.\n" ) )

  ## Message in masterlog.
  message( paste( "Library", .sfPars$package, "loaded in cluster.\n" ) )
}

вы увидите, что он также вызывает message, то есть не по умолчанию capture.output. Вы всегда можете использовать capture.output(..., type="message"), но тогда вы также не захватываете вывод cat. Таким образом, вам остается захватить оба типа: либо с вложенным capture.output, либо с suppressMessages.

Я предлагаю вам либо использовать suppressMessages(invisible(capture.output(sfLibrary(raster)))), либо написать какую-нибудь вспомогательную функцию, которая делает это для вас.

...