[r] 중단 / 종료 스크립트

몇 가지 데이터 분석을 수행하고 수백 줄 길이의 프로그램이 있습니다.

프로그램 초반에 품질 관리를하고 데이터가 충분하지 않으면 프로그램을 종료하고 R 콘솔로 돌아 가기를 원합니다. 그렇지 않으면 나머지 코드를 실행하고 싶습니다.

나는 시도했다 break, browser그리고 quit그들 중 누구도 나머지 프로그램의 실행을 중지하지 않습니다 (그리고 quit나는 일이하고 싶은 일이 아닙니다 아니라 완전히 종료 R,과 실행을 중지). 마지막 수단은 if-else다음과 같은 성명서를 작성하는 것입니다.

 if(n < 500){}
 else{*insert rest of program here*}

그러나 그것은 나쁜 코딩 습관처럼 보입니다. 내가 뭔가를 놓치고 있습니까?



답변

stopifnot()프로그램이 오류를 생성 하도록하려면 함수를 사용할 수 있습니다 .

foo <- function(x) {
    stopifnot(x > 500)
    # rest of program
}


답변

예쁘지는 않지만 여기 exit()에 나를 위해 작동하는 R 에서 명령 을 구현하는 방법이 있습니다.

exit <- function() {
  .Internal(.invokeRestart(list(NULL, NULL), NULL))
}

print("this is the last message")
exit()
print("you should not see this")

가볍게 테스트했지만 이것을 실행하면 this is the last message오류 메시지없이 스크립트가 중단됩니다.


답변

if-else 구성을 뒤집으십시오.

if(n >= 500) {
  # do stuff
}
# no need for else


답변

편집 : OP가 긴 스크립트를 실행하는 것 같습니다.이 경우 품질 관리 스크립트의 일부만 래핑하면 됩니다.

if (n >= 500) {

.... long running code here

}

함수 에서 벗어나면 return()명시 적으로 또는 암시 적으로를 원할 것입니다 .

예를 들어, 명시 적 이중 반환

foo <- function(x) {
  if(x < 10) {
    return(NA)
  } else {
    xx <- seq_len(x)
    xx <- cumsum(xx)
  }
  xx ## return(xx) is implied here
}

> foo(5)
[1] 0
> foo(10)
 [1]  1  3  6 10 15 21 28 36 45 55

에 의해 return()암시되고, 난 당신이 수행했던 것처럼 마지막 줄 것을 의미 return(xx)하지만, 호출을 떠날 약간 더 효율적입니다 return().

일부는 잘못된 스타일을 여러 번 반환하는 것을 고려합니다. 긴 함수에서는 함수가 종료되는 위치를 추적하는 것이 어렵거나 오류가 발생하기 쉽습니다. 따라서 대안은 단일 반환 지점을 가지지 만 if () else ()절을 사용하여 반환 객체를 변경하는 것 입니다. 그러한 수정 foo()

foo <- function(x) {
  ## out is NA or cumsum(xx) depending on x
  out <- if(x < 10) {
    NA
  } else {
    xx <- seq_len(x)
    cumsum(xx)
  }
  out ## return(out) is implied here
}

> foo(5)
[1] NA
> foo(10)
 [1]  1  3  6 10 15 21 28 36 45 55


답변

어떤 시점에서 긴 스크립트 실행을 중지하고 싶을 수도 있습니다. 즉. C 또는 Python에서 exit ()를 하드 코딩하려는 것과 같습니다.

print("this is the last message")
stop()
print("you should not see this")


답변

이것은 오래된 질문이지만 아직 깨끗한 해결책이 없습니다. 이것은 아마도이 특정 질문에 대한 대답이 아니지만 ‘R 스크립트에서 우아하게 종료하는 방법’에 대한 답변을 찾는 사람들은 아마도 여기에 도착할 것입니다. R 개발자가 exit () 함수를 구현하는 것을 잊은 것 같습니다. 어쨌든 내가 찾은 트릭은 다음과 같습니다.

continue <- TRUE

tryCatch({
     # You do something here that needs to exit gracefully without error.
     ...

     # We now say bye-bye         
     stop("exit")

}, error = function(e) {
    if (e$message != "exit") {
        # Your error message goes here. E.g.
        stop(e)
    }

    continue <<-FALSE
})

if (continue) {
     # Your code continues here
     ...
}

cat("done.\n")

기본적으로 플래그를 사용하여 지정된 코드 블록의 연속 여부를 나타냅니다. 그런 다음 stop()함수를 사용하여 사용자 지정된 메시지를 tryCatch()함수 의 오류 처리기에 전달 합니다. 오류 처리기가 정상적으로 종료하라는 메시지를 수신하면 오류를 무시하고 계속 플래그를로 설정합니다 FALSE.


답변

“tools”패키지 의 pskill함수를 사용하여 R현재 프로세스를 중단하고 콘솔로 돌아갈 수 있습니다. 구체적으로, 각 스크립트의 시작 부분에서 소싱하는 시작 파일에 다음 함수가 정의되어 있습니다. 그러나 코드 시작 부분에 직접 복사 할 수도 있습니다. 그런 다음 halt()코드의 아무 지점 에나 삽입 하여 즉시 스크립트 실행을 중지합니다. 이 함수는 GNU / Linux에서 잘 작동하며 R문서 에서 판단하면 Windows에서도 작동합니다 (하지만 확인하지는 않았습니다).

# halt: interrupts the current R process; a short iddle time prevents R from
# outputting further results before the SIGINT (= Ctrl-C) signal is received 
halt <- function(hint = "Process stopped.\n") {
    writeLines(hint)
    require(tools, quietly = TRUE)
    processId <- Sys.getpid()
    pskill(processId, SIGINT)
    iddleTime <- 1.00
    Sys.sleep(iddleTime)
}