使用源。
如果您查看 的源代码sfLibrary
,特别是它打印这些消息的位置,您会发现它是 uses 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))))
或编写一些为您执行此操作的辅助函数。