Установите параметры curl, чтобы улучшить читаемость прогресса в R download.file()

Я использую download.file(..., method="curl") R для загрузки различных текстовых файлов. Обновления статуса от 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 для OS X.

Есть ли параметр 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 

Я посмотрел curl-config и ничего не увидел.


person C8H10N4O2    schedule 18.10.2014    source источник


Ответы (1)


Насколько я знаю, нет возможности заставить curl использовать \n вместо \r. Однако вы можете сделать это самостоятельно. Это специфичный для OS X ответ, но его можно адаптировать для Linux. Используя homebrew, выполните brew install coreutils, чтобы мы могли получить доступ к gstdbuf, что поможет нам получить небуферизованный вывод команды.

Затем напишите небольшой сценарий оболочки (я назвал его 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 вместо 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%)|
person hrbrmstr    schedule 18.10.2014