使用R.exeRterm.exe,可以提供出色的进度表。

page=getURL(url="ftp.wcc.nrcs.usda.gov", noprogress=FALSE)

在Rgui中,我仅限于:
page=getURL(url="ftp.wcc.nrcs.usda.gov",
            noprogress=FALSE, progressfunction=function(down,up) print(down))

提供的下载信息非常有限。

有办法改善吗?

最佳答案

我开始怀疑使用标准R命令是否可以重新打印覆盖当前行,这就是RCurl在非GUI模式下的作用。

我很高兴地说我错了。至少对于一行而言,\r可以解决问题。事实上:

conc=function(){
    cat(" abcd")
    cat(" ABCD", '\n')

}
conc()

# abcd ABCD

但:
over=function(){
    cat(" abcd")
    cat("\r ABCD", "\n")
}
over()

# ABCD

鉴于此,我编写了这个progressDown函数,该函数可以始终在同一行上监视下载状态的重写:
library(RCurl) # Don't forget

### Callback function for curlPerform
progressDown=function(down, up, pcur, width){
    total=as.numeric(down[1]) # Total size as passed from curlPerform
    cur=as.numeric(down[2])   # Current size as passed from curlPerform
    x=cur/total
    px= round(100 * x)
    ## if(!is.nan(x) &&  px>60) return(pcur) # Just to debug at 60%
    if(!is.nan(x) && px!=pcur){
        x= round(width * x)
        sc=rev(which(total> c(1024^0, 1024^1, 1024^2, 1024^3)))[1]-1
        lb=c('B', 'KB', 'MB', 'GB')[sc+1]
        cat(paste(c(
            "\r  |", rep.int(".", x), rep.int(" ", width - x),
            sprintf("| %g%s of %g%s %3d%%",round(cur/1024^sc, 2), lb, round(total/1024^sc, 2), lb, px)),
                  collapse = ""))
        flush.console() # if the outptut is buffered, it will go immediately to console
        return(px)
    }
    return(pcur)
}

现在我们可以将回调函数与curlPerform一起使用
curlProgress=function(url, fname){
    f = CFILE(fname, mode="wb")
    width= getOption("width") - 25   # you can make here your line shorter/longer
    pcur=0
    ret=curlPerform(url=url, writedata=f@ref,  noprogress=FALSE,
        progressfunction=function(down,up) pcur<<-progressDown(down, up, pcur, width),
        followlocation=T)
        close(f)
        cat('\n Download', names(ret), '- Ret', ret, '\n') # is success?
}

使用一个小的示例二进制文件运行它:
curlProgress("http://www.nirsoft.net/utils/websitesniffer-x64.zip", "test.zip")

60%的中间输出是(无#保护):
  |.................................                      | 133.74KB of 222.75KB  60%

其中KB,将基于总大小调整为B, KB, MB, GB

具有成功状态的最终输出是:
  |.......................................................| 222.61KB of 222.75KB 100%
 Download OK - Ret 0

注意,输出行的宽度是相对于R width选项的(它控制一行的最大列数),可以通过更改curlProgress行来定制:
width= getOption("width") - 25

这足以满足我的需要并解决了我自己的问题。

关于r - RCurl:在Rgui中显示进度表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21731548/

10-09 15:37