ProgramingTip

중단 / 종료 펼쳐

bestdevel 2020. 11. 5. 08:26
반응형

중단 / 종료 펼쳐


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

프로그램을 초반에 품질 관리 프로그램을 종료하고 R 콘솔로 돌아 가기를 원합니다. 확장자 나머지 코드가 실행되기를 원합니다.

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

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

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


stopifnot()프로그램이 오류를 생성 수있는 함수를 사용할 수 있습니다 .

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

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

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

예쁘지는 않지만 여기 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오류 메시지없이 펼쳐집니다.


편집 : 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")

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

이것은 오래된 질문이지만 아직 깨끗한 해결책이 없습니다. 이것은 아마도이 특정 질문에 대한 대답이 아니지만 '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.


여기:

if(n < 500)
{
    # quit()
    # or 
    # stop("this is some message")
}
else
{
    *insert rest of program here*
}

둘 다 quit()stop(message)스크립트를 종료합니다. R 명령 프롬프트에서 스크립트를 소싱하는 경우 quit()R에서도 종료됩니다.

참고 URL : https://stackoverflow.com/questions/17837289/break-exit-script

반응형