设置curl选项以提高R download.file()中进度的可读性

时间:2014-10-18 13:10:14

标签: r curl options

我正在使用R' download.file(..., method="curl")来下载各种文本文件。来自curl的状态更新没有" \ n"每次更新后,出现的内容如下所示,没有换行符:

> url1 <- "https://d396qusza40orc.cloudfront.net/getdata%2Fdata%2Fss06hid.csv"
> q1f <- "wk3q1f.csv"
> download.file(url1,q1f,method="curl")
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0  0 4147k    0 18404    0     0  14232      0  0:04:58  0:00:01  0:04:57 14233  2 4147k    2  114k    0     0  51344      0  0:01:22  0:00:02  0:01:20 51341

使用的版本:libcurl 7.30.0,R 3.1.0 for OS X。

我是否可以为换行符设置卷曲选项以生成进度报告:

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0  
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0  
  0 4147k    0 18404    0     0  14232      0  0:04:58  0:00:01  0:04:57 14233  
  2 4147k    2  114k    0     0  51344      0  0:01:22  0:00:02  0:01:20 51341 

我看着curl-config并没有看到任何东西。

1 个答案:

答案 0 :(得分:3)

我无法让curl使用\n代替我所知道的\r。但是,您可以自己完成此操作。这是OS X的具体答案,但可以适用于Linux。使用homebrew执行brew install coreutils,以便我们可以访问gstdbuf,这将有助于我们获得无缓冲的命令输出。

接下来,用一行写一个小的shell脚本(我称之为mycurl):

gstdbuf -i0 -o0 -e0 curl $1 -o $2 2>&1 | gstdbuf -i0 -o0 -e0 tr '\r' '\n'

确保它的可执行文件(chmod 755 mycurl

download.file只需执行以下method="curl"

else if (method == "curl") {
    if (quiet) 
        extra <- c(extra, "-s -S")
    if (!cacheOK) 
        extra <- c(extra, "-H 'Pragma: no-cache'")
    status <- system(paste("curl", paste(extra, collapse = " "), 
        shQuote(url), " -o", shQuote(path.expand(destfile))))

所以,我们可以用:

来模仿它
status <- system(paste("/path/to/mycurl", shQuote(url1), shQuote(path.expand(q1f))))

这将通过换行符为您提供下载进度。

Linux用户可以使用stdbuf vs gstdbuf,因为coreutiles homebrew包会在g之前添加命令。

或者,您可以使用GET包中的httr write_disk选项,并使用更像R的进度表:

library(httr)

status <- GET(url1, write_disk(path.expand(q1f), overwrite=TRUE), progress("down"))
|==================================================== (etc. to 100%)|