问题描述
我知道该函数有一个 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}}、libcurl
或 wget
)。 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
选项可用时。