Подавлять начальные сообщения при загрузке библиотеки в кластер Snowfall с помощью sfLibrary

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

library(snowfall)
library(snow)

sfInit(parallel = TRUE, cpus = 3)

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

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

Спасибо.

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

подавлять сообщения (sfLibrary (растр))

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

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

подавлятьPackageStartupMessages (sfLibrary (растр))

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

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


person TheRealJimShady    schedule 14.01.2020    source источник
comment
Отвечает ли это на ваш вопрос? R запретить запуск сообщений из зависимости   -  person Clemsang    schedule 14.01.2020
comment
Нет, это не так. Пожалуйста, смотрите выше изменения к моему вопросу. Эти параметры не работают с sfLibrary() .   -  person TheRealJimShady    schedule 14.01.2020
comment
Попробуйте capture.output в сочетании с другими предложениями.   -  person alan ocallaghan    schedule 14.01.2020


Ответы (1)


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

Если вы посмотрите на исходный код для 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)))), либо написать вспомогательную функцию, которая сделает это за вас.

person r2evans    schedule 14.01.2020
comment
Хорошая следственная работа! Ваше последнее предложение работает хорошо. - person Fleur De Lys; 14.01.2020
comment
Спасибо за отличный ответ. - person TheRealJimShady; 14.01.2020