Использовать источник.
Если вы посмотрите на исходный код для sfLibrary
, особенно там, где он печатает эти сообщения , вы увидите, что это использует sfCat
. Отслеживая это ( тот же файл ), он использует cat
.
Я знаю два способа предотвратить сброс cat
на консоль: capture.output
и sink
.
capture.output
: "вычисляет свои аргументы с выводом, возвращаемым в виде строки символов или отправляемым в файл" .
cat("quux4\n")
# quux4
invisible(capture.output(cat("quux5\n")))
cat("quux6\n")
# quux6
Поскольку capture.output
возвращает захваченный вывод видимым образом как вектор character
, заключая его в invisible
или сохраняя возвращаемое значение в переменную (которая игнорируется и / или удалено) будет препятствовать его выводу на консоль.
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))))
, либо написать какую-нибудь вспомогательную функцию, которая делает это для вас.