중단 / 종료 펼쳐
몇 가지 데이터 분석을 수행하고 수백 개의 길이의 프로그램이 있습니다.
프로그램을 초반에 품질 관리 프로그램을 종료하고 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
'ProgramingTip' 카테고리의 다른 글
SpannableStringBuilder는 여러 글꼴 / 텍스트 크기 등으로 많은을 생성합니다. 예? (0) | 2020.11.06 |
---|---|
Intellisense는 Visual Studio 2012의 JavaScript에서 작동하지 않습니다. (0) | 2020.11.06 |
NodeJS-setTimeout (fn, 0) 대 setImmediate (fn) (0) | 2020.11.05 |
컴파일러가 "char"를 "int"와 일치하지만 "short"가 아닌 이유는 무엇입니까? (0) | 2020.11.05 |
Kotlin 지원 필드는 무엇입니까? (0) | 2020.11.05 |