使用 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.outputsink

  1. 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 删除)将阻止其在控制台上的输出。

  2. 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)))) 或编写一些辅助函数来为您完成这项工作。