2014-02-12 5 views
3

R.exe 또는 Rterm.exe을 사용하면 우수한 진행률을 얻을 수 있습니다. 다운로드 정보의 매우 제한된을 제공RCurl : 진행률계를 Rgui에 표시

page=getURL(url="ftp.wcc.nrcs.usda.gov", 
      noprogress=FALSE, progressfunction=function(down,up) print(down)) 

:

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

은 Rgui에서 나는 제한하고있다.

개선 할만한 방법이 있습니까?

답변

3

나는 표준 R 명령으로이 RCurl 비 GUI 모드에서 무엇이며 현재 행을 덮어 쓰기를 다시 인쇄하는 것이 가능하다는 것을 의심 시작합니다.

나는 틀렸다고 말해 주어서 기쁩니다. 최소한 단일 회선의 경우 \r이 트릭을 수행 할 수 있습니다.

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

} 
conc() 

# abcd ABCD 

:하지만 사실 우리가 지금

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) 
} 

:

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

# ABCD 

주어진, 나는 같은 같은 줄에 항상 재 작성 다운로드 상태를 모니터링 할 수 있습니다이 progressDown 기능을 썼다 콜백을 사용할 수 있습니다. 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, [email protected], 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? 
} 
백45경1천5백15조5백36억9천1백36만3천2백10

작은 샘플 바이너리로 러닝

60 %의 중간 출력은 (더 # 보호)하지
curlProgress("http://www.nirsoft.net/utils/websitesniffer-x64.zip", "test.zip") 

: 전체에 B, KB, MB, GB 조정한다 KB

|.................................      | 133.74KB of 222.75KB 60% 

를 기초 크기. 성공 상태

최종 출력된다 :

|.......................................................| 222.61KB of 222.75KB 100% 
Download OK - Ret 0 

참고 출력 라인 폭 (라인에 열들의 최대 수를 제어하는) 상기 curlProgress 변화 정의 할 수 R 폭 옵션 상대적 줄 :

width= getOption("width") - 25 

이것은 내 필요에 충분하며 내 자신의 질문을 해결합니다.

1

무엇에 대해 :

curlProgress=function(url, fname){ 
    f = CFILE(fname, mode="wb") 
    prev=0 
    ret=curlPerform(url=url, [email protected], noprogress=FALSE, 
     progressfunction=function(a,b){ 
      x=round(100*as.numeric(a[2])/as.numeric(a[1])) 
      if(!is.nan(x) && x!=prev &&round(x/10)==x/10) prev<<-x else x='.' 
      cat(x)  
     }, followlocation=T) 
    close(f) 
    cat(' Download', names(ret), '- Ret', ret, '\n') 
} 

?
도트 또는 백분율 다운로드를 10으로 나누고 줄을 50 %로 나누어 인쇄합니다.
그리고 작은 223킬로바이트 파일과 :

curlProgress("http://www.nirsoft.net/utils/websitesniffer-x64.zip", "test.zip") 

는이 같은 소리 :

................10...............20................30...............40...............50 
..............................70...............80...............90...............100... Download OK - Ret 0 

I 표준 R 명령으로 무엇을하다 현재 행을 덮어 쓰기를 다시 인쇄하는 것이 가능하다는 것을 의심 시작 RCurl은 GUI가 아닌 모드입니다.

2

다음은 txtProgressBar을 사용하는 간단한 예입니다. 기본적으로 HEAD 요청을 먼저 검색하여 검색 할 파일의 파일 크기를 가져온 다음 txtProgressBar을 최대 크기로 설정하십시오. 그런 다음 curlPerform에 인수를 사용하여 setTxtProgressBar에 전화하십시오. 모든 내용은 매우 훌륭하게 작동합니다 ("content-length"헤더가 없으면이 코드는 진행률 표시 줄을 인쇄하지 않음).

url <- 'http://stackoverflow.com/questions/21731548/rcurl-display-progress-meter-in-rgui' 

h <- basicTextGatherer() 
curlPerform(url=url, customrequest='HEAD', 
      header=1L, nobody=1L, headerfunction=h$update) 

if(grepl('Transfer-Encoding: chunked', h$value())) { 
    size <- 1 
} else { 
    size <- as.numeric(strsplit(strsplit(h$value(),'\r\nContent-Type')[[1]][1], 
                'Content-Length: ')[[1]][2]) 
} 

bar <- txtProgressBar(0, size) 
h2 <- basicTextGatherer() 
get <- curlPerform(url=url, noprogress=0L, 
        writefunction=h2$update, 
        progressfunction=function(down,up) 
         setTxtProgressBar(bar, down[2])) 

h2$value() # return contents of page 

콘솔의 출력은 ======입니다.