0

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

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))

库光栅已加载。

集群中加载的图书馆栅格。

4

1 回答 1

3

使用源。

如果您查看 的源代码sfLibrary,特别是它打印这些消息的位置,您会发现它是 uses sfCat。追踪它(同一个文件),它使用cat.

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

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

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

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

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

于 2020-01-14T15:55:57.823 回答