我在下面运行的代码示例。
library(snowfall)
library(snow)
sfInit(parallel = TRUE, cpus = 3)
sfLibrary(raster)
Library raster loaded.
Library raster loaded in cluster.
我想阻止 sfLibrary 打印消息。我不知道怎么做。请帮忙...
谢谢。
编辑1:这不起作用:
抑制消息(sf库(栅格((
库栅格已加载。
编辑2:这不起作用:
抑制包启动消息(sf库(光栅((
库栅格已加载。
在聚类中加载的库栅格。
使用源代码。
如果您查看sfLibrary
的源代码,特别是它打印这些消息的位置,您会发现它使用了sfCat
。向下追踪(同一文件(,它使用cat
.
我知道有两种方法可以防止cat
转储到控制台上:capture.output
和sink
。
-
capture.output
:">计算其参数,输出作为字符串返回或发送到文件"。cat("quux4n") # quux4 invisible(capture.output(cat("quux5n"))) cat("quux6n") # quux6
由于
capture.output
以character
向量的形式返回捕获的输出,因此将其包装在invisible
中或将返回值存储到变量中(被忽略和/或删除(将阻止其在控制台上的输出。 -
sink
:">将R输出发送到文件"。cat("quux1n") # quux1 sink("ignore_me.txt") cat("quux2n") sink(NULL) # remove the sink cat("quux3n") # 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))))
或编写一些辅助函数来为您执行此操作。