使用 sfLibrary 将库加载到降雪集群时抑制启动消息
Suppress start-up messages when loading a library to snowfall cluster with sfLibrary
我下面的代码示例运行。
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(光栅))
库栅格已加载。
库栅格加载到集群中。
使用来源。
如果您查看 sfLibrary
的源代码,特别是 prints those messages, you'll see that is uses sfCat
. Tracing that down (same file),它使用 cat
.
我知道有两种方法可以防止 cat
转储到控制台:capture.output
和 sink
。
capture.output
: "evaluates its arguments with the output being returned as a character string or sent to a file".
cat("quux4\n")
# quux4
invisible(capture.output(cat("quux5\n")))
cat("quux6\n")
# quux6
由于 capture.output
return 捕获的输出 可见 作为 character
向量,将其包装在 invisible
中或存储将 return 值放入变量中(忽略 and/or 删除)将阻止其在控制台上的输出。
sink
: "send R output to a file".
cat("quux1\n")
# quux1
sink("ignore_me.txt")
cat("quux2\n")
sink(NULL) # remove the sink
cat("quux3\n")
# quux3
我个人认为使用 sink
(一般而言)存在一些风险,尤其是在自动化方面。一个很好的例子是 knitr
在捕获代码块的输出时使用 sink
;对 sink
的嵌套调用有问题。精明的 reader 会注意到 capture.output
uses sink
,因此在这方面两者都不是更好。
再看源码(上面第一个link),
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))))
或编写一些辅助函数来为您完成这项工作。
我下面的代码示例运行。
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(光栅))
库栅格已加载。
库栅格加载到集群中。
使用来源。
如果您查看 sfLibrary
的源代码,特别是 prints those messages, you'll see that is uses sfCat
. Tracing that down (same file),它使用 cat
.
我知道有两种方法可以防止 cat
转储到控制台:capture.output
和 sink
。
capture.output
: "evaluates its arguments with the output being returned as a character string or sent to a file".cat("quux4\n") # quux4 invisible(capture.output(cat("quux5\n"))) cat("quux6\n") # quux6
由于
capture.output
return 捕获的输出 可见 作为character
向量,将其包装在invisible
中或存储将 return 值放入变量中(忽略 and/or 删除)将阻止其在控制台上的输出。sink
: "send R output to a file".cat("quux1\n") # quux1 sink("ignore_me.txt") cat("quux2\n") sink(NULL) # remove the sink cat("quux3\n") # quux3
我个人认为使用 sink
(一般而言)存在一些风险,尤其是在自动化方面。一个很好的例子是 knitr
在捕获代码块的输出时使用 sink
;对 sink
的嵌套调用有问题。精明的 reader 会注意到 capture.output
uses sink
,因此在这方面两者都不是更好。
再看源码(上面第一个link),
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))))
或编写一些辅助函数来为您完成这项工作。