2011-01-21 2 views
28

시간, 완료율 및 프로세스의 현재 상태와 같은 상태 메시지를 사용자에게 표시하는 함수를 작성하고 싶습니다. 메시지를 처리 ​​할 수는 있지만 콘솔에 인쇄하고 다른 메시지를 뒤집어서 스크롤하는 것 외에 다른 작업을 수행하고 싶습니다. 메시지가 message()처럼 스크롤하지 않고 그래픽없이 변경되기를 정말로 바랍니다. R이 가능합니까?에 상태 메시지가 표시됩니다.

+10

"이것은 R.이다가없는 경우. 단 방법에 대해 설명합니다." - Simon Blomberg –

답변

24

어때?

for(i in 1:10) { 
    Sys.sleep(0.2) 
    # Dirk says using cat() like this is naughty ;-) 
    #cat(i,"\r") 
    # So you can use message() like this, thanks to Sharpie's 
    # comment to use appendLF=FALSE. 
    message(i,"\r",appendLF=FALSE) 
    flush.console() 
} 
+6

'cat()'과 같은 불만을 제기하는 R-bloggers 게시물에서 논의 된 것처럼'cat()'을 사용하지 말고,'message()'를 사용한다. –

+1

@Dirk :'message (..., appendLF = FALSE)'이어야합니다. 그렇지 않으면 OP가 특별히 피하고 싶었던 콘솔에 스크롤링 메시지가 나타납니다. – Sharpie

+0

@Dirk'cat()'을'message()'로 바꾸면 각 업데이트마다 개행 문자가 추가됩니다. 개행을 막기 위해 여분의 조치를 취해야합니까? FWIW,'txtProgressBar'는'cat()'을 사용합니다. –

7

가이 작업을 수행하는 더 우아한 방법이 될 수 있지만 그것을 할 수 있습니다 : 당신이 자동으로 메시지를 생성하는 경우

test.message <- function() { 
    for (i in 1:9){ 
    cat(i) 
    Sys.sleep(1) 
    cat("\b") 
    } 

} 

것은, 당신은 얼마나 많은 \ B 문자를 계산해야합니다 정확한 양을 백업하기 위해 출력하는 것이지만 그것은 매우 간단합니다.

17

utils 패키지에는 txtProgressBar과 업데이트 완료 기능이 포함되어 있습니다.이 기능을 사용하면 프로세스 완료율을 표시하는 데 사용할 수 있습니다.

업데이트는 콘솔을 스크롤하지 않고 처리하는 방법의 예는 txtProgressBar 호출하는 동안 생성 된 up1, up2up3 기능을 참조하십시오.

+2

환상적입니다! 'tpb <- txtProgressBar (...);를 통해 자신의 업데이트 기능을 생성하고 설정할 수도 있습니다. myUpFun <- 함수 (값) {...}; tpb $ up <- myUpFun'입니다. 그런 다음 Dirk이 노이즈를 억제 할 수 있도록'message()'를 사용하여 업데이트 함수를 작성할 수 있습니다. ;-) –

+0

@ Joshua : 좋은 관찰! 커스텀 업데이트 함수를 만드는 것에 대해 숙고 할 때, 그것을 구현하기 위해서'txtProgressBar()'를 복사하고 다시 작성해야한다는 생각을했습니다. – Sharpie

+0

'plyr :: progress_text'도 있습니다. 그것은 txtProgressBar'에 대한 단순한 래퍼입니다. 그러나 ... – aL3xa

15

여기 블링 블링이 있습니다. ?tcltk::tkProgressBar.

pb <- tkProgressBar("test progress bar", "Some information in %", 
     0, 100, 50) 
Sys.sleep(0.5) 
u <- c(0, sort(runif(20, 0 ,100)), 100) 
for(i in u) { 
    Sys.sleep(0.1) 
    info <- sprintf("%d%% done", round(i)) 
    setTkProgressBar(pb, i, sprintf("test (%s)", info), info) 
} 
Sys.sleep(5) 
close(pb) 

alt text

+1

정말 멋지지만, 현재 유일한 필요는 텍스트 전용 솔루션입니다. –

+2

tcltk가 터지면 끝까지 질문을 읽지 못했습니다. 그것은 충동적인 대답이었고, 나는 사과했다. 어쩌면 미래의 당신은 언젠가 그것을 필요로 할 것입니다. –

+0

+1 환상적. 심지어 TclTk에 대해 조금 배우게됩니다. – Iterator