code

R에서 예외 처리

codestyles 2020. 8. 22. 08:57
반응형

R에서 예외 처리


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


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

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


기본적으로 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")) 

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


관련 Google 검색의 결과는 http://biocodenv.com/wordpress/?p=15 입니다.

for(i in 1:16){
result <- try(nonlinear_modeling(i));
if(class(result) == "try-error") next;
}

재시작 기능은 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(){})

이 기능 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)
}

A mid-level programmer also writes a function to calculate the absolute value, making use of the woefully incomplete low_level_ABS function. He knows that the low level code throws a negative_value error when the value of x is negative and suggests an solution to the problem, by establishing a restart which allows users of mid_level_ABS to control the way in which mid_level_ABS recovers (or doesn't) from a negative_value error.

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

Finally, a high level programmer uses the mid_level_ABS function to calculate the absolute value, and establishes a condition handler which tells the mid_level_ABS to recover from a negative_value error by using the restart handler.

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

The point of all this is that by using withRestarts() and withCallingHandlers(), the function high_level_ABS was able to tell mid_level_ABS how to recover from errors raised by low_level_ABS error without stopping the execution of mid_level_ABS, which is something you can't do with tryCatch():

> 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

In practice, low_level_ABS represents a function that mid_level_ABS calls a lot (maybe even millions of times), for which the correct method of error handling may vary by situation, and choice of how to handle specific errors is left to higher level functions (high_level_ABS).

참고URL : https://stackoverflow.com/questions/2622777/exception-handling-in-r

반응형