2012-06-04 2 views
3

예상 모델 테스트와 함께 거대한 데이터 세트의 1000+ 루프로 인해 실행하는 데 시간이 걸리는 함수를 작성했습니다.함수 내 메시지 (상태에 대한)가 콘솔에 즉시 표시되지 않음

상태를 알기 위해 함수가 호출되는 동안 함수의 for-loop 안에 message 명령을 사용합니다. 문제는 즉시 표시하는 대신 기능 완료 후에 콘솔에 모든 메시지가 표시된다는 것입니다. 그래서 그것은 도움이되지 않습니다 :)

나는 Stackoverflow에 대한 해결책을 찾으려고했지만 하나를 찾지 못했습니다. 예를 들어 "showing a status message in R"질문을 보았습니다. 이 질문에 대한 모든 답변과 예제 코드는 함수가 즉시 처리 된 후에도 콘솔에 텍스트 만 제공합니다.

해결 방법? 콘솔에 텍스트 message의 즉시 인쇄를 방지하는 R 설정이 있습니까?

참고 : 아래 예제는 내 기능과 동일한 결과를 제공합니다. 함수를 처리 한 후 텍스트를 보여줍니다.

예 1 (여호수아 울리히) :

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

예 2 (타일러) :

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

편집 : 첫 번째 예제는 작동하지 않습니다 ('플러시 콘솔'문제였다). 하지만 테스트를했을 때, 어떤 이유로 플러시 콘솔을 주석 처리했습니다 : S

+1

두 번째 예제에서 문자열에 줄 바꿈이 없으므로 줄을 한 번에 인쇄 할 수 없으므로 stdout을 플러시해야합니다. 'flush (stdout())'이 트릭을해야한다. – fotNelton

답변

3
test.message <- function() { 
    for (i in 1:9){ 
     cat(paste(as.character(i),'\n')) 
     flush.console() 
     Sys.sleep(1) 
    } 
    } 

이는 fotNelton의 권장 사항과 유사합니다.

편집 : ttmaccer가 가장 적절합니다. 방금 우분투 서버에서 테스트했는데 코드가 콘솔을 비우지 않고 작동합니다.

+0

해결책은'flush.console()'... ttmaccer가 대답 한 것처럼 윈도우 문제 일 수 있습니다. 그러나 나는 그것이 작동하기 때문에 기뻐 ... – FBE

+0

우리는 언제 flush.console()을 사용해야합니까? 어떤 명령을 제안 : 쇼, 메시지, 고양이, 인쇄, ...? – skan

1

아마도이 문제는 Windows 관련 문제라고 생각됩니다. Cygwin 셸에서 Linux 나 R을 실행하면 flush.console()이 필요하지 않을 수 있습니다.

+3

Windows의 기본값은 출력을 버퍼링하는 것이며,'flush.console'은 버퍼링 된 정보를 콘솔에 보냅니다. linux의 기본값은 버퍼링을하지 않기 때문에'flush.console'은 필요하지 않지만 실제로 해가되지는 않습니다. –

0

진행률 표시 줄 기능 (winProgressBar, tkProgressBar 또는 txtProgressBar) 중 하나를 사용하는 것이 좋습니다. win 버전은 Windows에서만 작동하지만 win 및 tk 버전은 출력을 혼란스럽게하지 않고 다른 작은 창을 열고 거기에 진행 상황을 표시하는 이점이 있습니다.

진행률 표시 줄에 루프를 통한 진행 상황을 표시 할 수 있지만 label 인수와 함께 다른 세부 정보를 업데이트하고 표시 할 수 있습니다.

관련 문제