使用 sf Library 将库加载到降雪集群时抑制启动消息

Posted

技术标签:

【中文标题】使用 sf Library 将库加载到降雪集群时抑制启动消息【英文标题】:Suppress start-up messages when loading a library to snowfall cluster with sfLibrary 【发布时间】:2020-05-01 08:51:02 【问题描述】:

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

library(snowfall)
library(snow)

sfInit(parallel = TRUE, cpus = 3)

sfLibrary(raster)
Library raster loaded.
Library raster loaded in cluster.

我想阻止 sfLibrary 打印消息。我不知道怎么做。请帮忙...

谢谢。

编辑 1:这不起作用:

suppressMessages(sfLibrary(raster))

已加载库栅格。

编辑 2:这不起作用:

suppressPackageStartupMessages(sfLibrary(raster))

已加载库栅格。

已加载到集群中的库栅格。

【问题讨论】:

这能回答你的问题吗? R suppress startupMessages from dependency 不,它没有。请参阅上面对我的问题的修改。这些选项似乎不适用于 sfLibrary() 。 结合其他建议尝试capture.output 【参考方案1】:

使用源代码。

如果您查看sfLibrary 的源代码,特别是prints those messages 的位置,您会发现它使用了sfCat。追踪它(same file),它使用cat

我知道防止cat 转储到控制台的两种方法:capture.outputsink

    capture.output“评估其参数,并将输出作为字符串返回或发送到文件”

    cat("quux4\n")
    # quux4
    invisible(capture.output(cat("quux5\n")))
    cat("quux6\n")
    # quux6
    

    由于capture.outputcharacter 向量的形式返回捕获的输出可见,将其包装在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.outputuses 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)))) 或编写一些帮助函数来为你做这件事。

【讨论】:

很好的调查工作!您的最终建议效果很好。 感谢您的出色回答。

以上是关于使用 sf Library 将库加载到降雪集群时抑制启动消息的主要内容,如果未能解决你的问题,请参考以下文章

在 R 中使用降雪包做一些模拟

R:在doParallel /降雪中制作集群挂起

使用降雪包并行化 R 代码

如何将库添加到我的.jar文件中

R 降雪:并行应用于表格列

与降雪库并行化的结果不可重现?