R에서 예외 처리 [닫힘]


97

R에서 예외 처리에 대한 예제 / 튜토리얼이 있습니까? 공식 문서는 매우 간결합니다.


1
이것은 또한 좋은 예입니다 : stackoverflow.com/q/12193779/2026975 .
imriss 2013-08-14

: 나는 매우 유용 할이 블로그 게시물을 발견 http://mazamascience.com/WorkingWithData/?p=912
paul_dg

답변:


31

다른 StackOverflow 토론을 가리키는 Shane의 답변 외에도 코드 검색 기능을 사용해 볼 수 있습니다. Google의 코드 검색에 대한 원래 답변은 이후 중단되었지만 시도해 볼 수 있습니다.

기록을 위해서도 try있지만 더 좋을 tryCatch수도 있습니다. Google 코드 검색에서 빠른 계산을 시도했지만 동사 자체에 대해 너무 많은 오 탐지가 발생했지만 tryCatch더 널리 사용되는 것 같습니다 .


이 예제가 도움이 될 수 있습니다. http://stackoverflow.com/a/12195574/2026975
imriss

Github의 검색 아마도 소멸 링크에 대한 품위를 대체합니다.
그레고르 토마스

모든 링크가 끊어졌습니다.
Toros91

60

기본적으로 tryCatch()기능 을 사용하고 싶습니다 . 자세한 내용은 help ( "tryCatch")를 참조하십시오.

다음은 간단한 예입니다 (오류로 원하는 모든 작업을 수행 할 수 있음을 명심하십시오).

vari <- 1
tryCatch(print("passes"), error = function(e) print(vari), finally=print("finished")) 
tryCatch(stop("fails"), error = function(e) print(vari), finally=print("finished")) 

다음과 같은 관련 질문을 살펴보십시오.



8

이 기능 trycatch()은 매우 간단하며 이에 대한 좋은 튜토리얼이 많이 있습니다. R에 오류 처리의 우수한 설명은 해들리 위컴의 책에서 찾을 수 있습니다 고급-R , 무엇을 다음과 것은이다 매우 기본적인 소개 withCallingHandlers()withRestarts()가능한 몇 마디로에서 :

저수준 프로그래머가 절대 값을 계산하는 함수를 작성한다고 가정 해 보겠습니다. 그는 그것을 계산하는 방법을 모르지만 오류를 구성하는 방법을 알고 있으며 자신의 순진함을 부지런히 전달합니다.

low_level_ABS <- function(x){
    if(x<0){
        #construct an error
        negative_value_error <- structure(
                    # with class `negative_value`
                    class = c("negative_value","error", "condition"),
                    list(message = "Not Sure what to with a negative value",
                         call = sys.call(), 
                         # and include the offending parameter in the error object
                         x=x))
        # raise the error
        stop(negative_value_error)
    }
    cat("Returning from low_level_ABS()\n")
    return(x)
}

중간 수준의 프로그래머는 절대 값을 계산하는 함수를 작성하여 매우 불완전한 low_level_ABS함수를 사용 합니다. 그는 negative_value 의 값 x이 음수 일 때 하위 수준 코드가 오류를 던지고 사용자가 오류 에서 복구 (또는 복구하지 않음) 하는 방식을 제어 할 수 있도록 하는 a 를 설정하여 문제에 대한 해결책을 제안 한다는 것을 알고 restart있습니다 .mid_level_ABSmid_level_ABSnegative_value

mid_level_ABS <- function(y){
    abs_y <- withRestarts(low_level_ABS(y), 
                          # establish a restart called 'negative_value'
                          # which returns the negative of it's argument
                          negative_value_restart=function(z){-z}) 
    cat("Returning from mid_level_ABS()\n")
    return(abs_y)
}

마지막으로 고급 프로그래머는 mid_level_ABS함수를 사용하여 절대 값을 계산 하고 재시작 처리기를 사용하여 오류 mid_level_ABS에서 복구하도록 지시하는 조건 처리기를 설정 negative_value합니다.

high_level_ABS <- function(z){
    abs_z <- withCallingHandlers(
            # call this function
            mid_level_ABS(z) ,
            # and if an `error` occurres
            error = function(err){
                # and the `error` is a `negative_value` error
                if(inherits(err,"negative_value")){
                    # invoke the restart called 'negative_value_restart'
                    invokeRestart('negative_value_restart', 
                                     # and invoke it with this parameter
                                     err$x) 
                }else{
                    # otherwise re-raise the error
                    stop(err)
                }
            })
    cat("Returning from high_level_ABS()\n")
    return(abs_z)
}

이 모든 것의 요점은 withRestarts()and 를 사용 withCallingHandlers()하여 함수 high_level_ABS가 의 실행을 중지하지 않고 mid_level_ABS오류로 인해 발생한 오류를 복구하는 방법을 알려줄 수 있다는 것입니다 .low_level_ABSmid_level_ABStryCatch()

> high_level_ABS(3)
Returning from low_level_ABS()
Returning from mid_level_ABS()
Returning from high_level_ABS()
[1] 3
> high_level_ABS(-3)
Returning from mid_level_ABS()
Returning from high_level_ABS()
[1] 3

실제로 는 많은 호출 (수백만 번까지) low_level_ABS하는 함수 mid_level_ABS를 나타내며, 올바른 오류 처리 방법은 상황에 따라 다를 수 있으며 특정 오류를 처리하는 방법의 선택은 더 높은 수준의 함수 ( high_level_ABS)에 맡겨집니다 .


7

재시작 기능은 Lisp에서 상속 된 R에서 매우 중요합니다. 루프 본문에서 일부 함수를 호출하고 함수 호출이 축소되는 경우 프로그램을 계속하려는 경우에 유용합니다. 이 코드를 시도하십시오.

for (i in 1:20) withRestarts(tryCatch(
if((a <- runif(1))>0.5) print(a) else stop(a),
finally = print("loop body finished!")), 
abort = function(){})
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.