2013-09-10 2 views
22

sink() 함수를 사용하여 R 출력을 파일로 변환 할 수 있음을 알고 있습니다.싱크가 파일을 출시하지 않음

sink('sink-closing.txt') 
cat('Hello world!') 
sink() 

해결되지 않은 싱크를 모두 닫는 간단한 명령이 있습니까?

아래에서 나는 내 질문에 대해 자세히 설명합니다.

내 R 스크립트가 R 스크립트에서 sink()을 열었지만 스크립트가 sink()을 닫기 전에 발생하는 R 스크립트에 오류가 있다고 가정합니다. R 스크립트를 여러 번 실행하여 오류를 수정하려고합니다. 마지막으로 모든 싱크를 닫고 콘솔에 인쇄하고 싶습니다. 어떻게해야합니까?

마지막으로 구체성을 위해 내가 직면 한 문제를 설명하기 위해 MWE를 제공합니다.

먼저 R 스크립트 sink-closing.R에 오류가 있습니다. 내가 발견하고 버그를 수정하려고으로

sink('sink-closing.txt') 

foo <- function() { 
    cat(sprintf('Hello world! My name is %s\n', 
       a.variable.that.does.not.exist)) 
} 

foo() 

sink() 

다음, 내가 실수로 3 회는 R-스크립트를 여러 번 source 말한다.

> source('~/Dropbox/cookbook/r-cookbook/sink-closing.R') 
Error in sprintf("Hello world! My name is %s\n", a.variable.that.does.not.exist) : 
    object 'a.variable.that.does.not.exist' not found 

이제 R 스크립트를 디버깅하고 콘솔로 인쇄하려고한다고 가정합니다. 이전 싱크를 닫으려면 sink() 번을 여러 번 호출 할 수 있습니다. 3 번 호출하면 이전과 같이 콘솔에 마지막으로 인쇄 할 수 있습니다. 그러나 내가 얼마나 많은 싱크대를 닫아야 하는지를 어떻게 알 수 있습니까?

+1

'sink.number'를 (를) 사용할 수 있습니까? – mnel

답변

28

sink.number()을 사용하여 얼마나 많은 전환이 이미 설정되었는지 알려줄 수 있으며 여러 번 호출하는 sink을 호출 할 수 있습니다. 함수로 퍼팅이

sink.reset <- function(){ 
    for(i in seq_len(sink.number())){ 
     sink(NULL) 
    } 
} 
+1

도움말 파일의 모든 문서를 읽기위한 또 다른 WIN! :-) –

9

는 @ mnel의 의견을 바탕으로 수 :

sinkall <- function() { 
    i <- sink.number() 
    while (i > 0) { 
    sink() 
    i <- i - 1 
    } 
} 

열려있는 모든 싱크를 닫아야합니다.

열려있는 장치의 수가 어디에도보고되지 않는 장치 및 플롯을 처리 할 때도이 문제가 발생할 수 있습니다. 보다 일반적인 경우에 당신은이를 사용할 수 있습니다

stopWhenError <- function(FUN) { 
    tryCatch({ 
    while(TRUE) { 
     FUN() 
    } 
    }, warning = function(w) { 
    print("All finished!") 
    }, error = function(e) { 
    print("All finished!") 
    }) 
} 

stopWhenError(sink) # for sink. 
stopWhenError(dev.off) # close all open plotting devices. 

편집 : sink가 영원히 실행되지 않도록 내가 으악, 코드를 수정 한 때문에 경고없는 오류가 발생합니다!

+0

'tryCatch'를 사용하라는 제안이 좋습니다. –

23
closeAllConnections() # ......................... 
+4

... 이제 왜 싱크 도움말 파일에 링크되어 있지 않습니까? – Dason

+0

그들은 일종의 연결이라는 사실을 정확히 숨기지 않았습니다. 그리고 '연결'페이지에 대한 링크가 있습니다. 그래서'? showConnections'에 2 홉 링크가되었습니다. –

+7

@Dason - 아마도'closeAllConnections'는 현재 열려있는 'sinks'뿐만 아니라 열려있는 다른 모든 연결을 닫을 것이기 때문에 아마도이 목적을 위해 사용하기에 매우 조잡한 도구이기 때문일 것입니다. –

관련 문제