使用 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.output
和sink
。
capture.output
:“评估其参数,并将输出作为字符串返回或发送到文件”。
cat("quux4\n")
# quux4
invisible(capture.output(cat("quux5\n")))
cat("quux6\n")
# quux6
由于capture.output
以character
向量的形式返回捕获的输出可见,将其包装在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.output
uses 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 将库加载到降雪集群时抑制启动消息的主要内容,如果未能解决你的问题,请参考以下文章