【问题标题】:How to suppress download.file() "trying URL..." message in R?如何在 R 中抑制 download.file()“正在尝试 URL ...”消息?
【发布时间】:2021-02-10 14:00:48
【问题描述】:

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

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

我用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, 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

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

【问题讨论】:

  • 我是否正确理解您不想使用quiet=TRUE 选项,因为您“需要”测试消息?
  • 这个问题的更清晰的措辞可能是“如何使testthat::expect_message() 抑制download.file() 命令生成的消息(就像通常那样)?”
  • 问题是这些消息是从curl 生成的,而不是从R 生成的。quiet = TRUE 选项将curl 命令修改为要求curl 保持安静。所以你需要一种拦截命令行输出的方法。 capture.output 可能有用,但我现在没时间试验……
  • @GregorThomas utils::capture.output 不起作用,可能是由于您所说的原因。不过,在测试中模拟函数可能是一种选择......
  • dario 和 GregorThomas,感谢您参与其中。为了清楚起见,Gregor 确实比我更好地提出了这个问题,谢谢!下面乔的回复为此提供了一个很好的解决方法。

标签: r download message


【解决方案1】:

suppressMessages() 不起作用,因为进度文本不是 R message(),它是系统库的标准输出,download.file() 将实际下载委托给(例如 libcurlwgetwininet)。 quiet = TRUE 通过设置该工具的适当命令行选项绕过此问题。

您可以将标准输出从 R 控制台转移到带有sink() 的文件。既然不需要,可以使用nullfile()打开与平台相关的空设备的文件连接:

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)

请注意,倒数第二行非常重要——它结束了转移。没有它,R 会话中的所有进一步消息都将发送到/dev/null

还请记住来自?sink 的以下警告:

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

除非您了解实现它的源代码,否则不要接收消息流,从而了解其中的陷阱。

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

【讨论】:

  • 很好的答案,谢谢!是的,我不打算在包装中使用它。我只是想摆脱这条在运行测试时让我有点烦恼的消息,但是在收到来自?sink 的警告后,我会保持原样。干杯!
猜你喜欢
  • 1970-01-01
  • 2015-12-20
  • 1970-01-01
  • 2018-01-28
  • 1970-01-01
  • 2013-10-07
  • 2018-08-23
  • 1970-01-01
相关资源
最近更新 更多