如何在 R 中抑制 download.file() “trying URL ...”消息?

问题描述

我知道该函数一个 quiet 参数,但我试图在 quiet = FALSE 时抑制该消息。

这可能很奇怪,但我在测试我正在编写的包时遇到了这个问题。我在设置 testthat::expect_message() 时使用了 quiet = FALSE,但该函数实际上并没有抑制消息(它应该,实际上它通常处理“正常”消息)。

我用 suppressMessages() 尝试过,但没有按预期工作:

url <- "https://github.com/ipeaGIT/gtfstools/raw/master/inst/extdata/spo_gtfs.zip"
download.file(url,destfile = tempfile(),quiet = FALSE)
#> trying URL 'https://github.com/ipeaGIT/gtfstools/raw/master/inst/extdata/spo_gtfs.zip'
#> Content type 'application/zip' length 191108 bytes (186 KB)
#> downloaded 186 KB

suppressMessages(download.file(url,quiet = FALSE))
#> trying URL 'https://github.com/ipeaGIT/gtfstools/raw/master/inst/extdata/spo_gtfs.zip'
#> Content type 'application/zip' length 191108 bytes (186 KB)
#> downloaded 186 KB

关于如何抑制它的任何想法,最好不要改变任何 options?这不是危及生命的情况,但它让我感到好奇。

解决方法

suppressMessages() 不起作用,因为进度文本不是 R message(),它是 download.file() 将实际下载委托给的系统库​​的标准输出(例如 {{ 1}}、libcurlwget)。 wininet 通过设置该工具的适当命令行选项来绕过这一点。

您可以使用 quiet = TRUE 将标准输出从 R 控制台转移到文件中。既然不需要,可以用sink()打开一个文件连接到依赖平台的空设备:

nullfile()

请注意,倒数第二行非常重要——它结束了转移。如果没有它,R 会话中的所有进一步消息都将发送到 url <- "https://github.com/ipeaGIT/gtfstools/raw/master/inst/extdata/spo_gtfs.zip" nullcon <- file(nullfile(),open = "wb") sink(nullcon,type = "message") download.file(url,destfile = tempfile(),quiet = FALSE) sink(type = "message") close(nullcon)

还要记住来自 /dev/null 的以下警告:

请勿将为接收器打开的连接用于任何其他目的。该软件将阻止您无意中关闭此类软件。

除非您了解实现消息流的源代码以及陷阱,否则不要接收消息流。

我个人认为这种方法在包中使用风险太大,尤其是当 ?sink 选项可用时。