r语言 - 使用 sfLibrary 将库加载到降雪群集时禁止显示启动消息



我在下面运行的代码示例。

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

  1. capture.output:">计算其参数,输出作为字符串返回或发送到文件"。

    cat("quux4n")
    # quux4
    invisible(capture.output(cat("quux5n")))
    cat("quux6n")
    # quux6
    

    由于capture.outputcharacter向量的形式返回捕获的输出,因此将其包装在invisible中或将返回值存储到变量中(被忽略和/或删除(将阻止其在控制台上的输出。

  2. 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))))或编写一些辅助函数来为您执行此操作。

相关内容

  • 没有找到相关文章

最新更新