R에서 예외 처리
R에서 예외 처리에 대한 예제 / 튜토리얼이 있습니까? 공식 문서는 매우 간결합니다.
다른 StackOverflow 토론을 가리키는 Shane의 답변 외에도 코드 검색 기능을 사용해 볼 수 있습니다. Google의 코드 검색에 대한 원래 답변은 이후 중단되었지만 시도해 볼 수 있습니다.
- Github 검색 예 를 들어이 쿼리에서 tryCatch in language = R ;
- Ohloh / Blackduck 코드 검색 예 : R 파일에서 tryCatch에 대한이 쿼리
- 전체 데비안 아카이브의 상단에 데비안 코드 검색 엔진
기록을 위해서도 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
'code' 카테고리의 다른 글
Mercurial에서 이식편 사용의 결과 (0) | 2020.08.22 |
---|---|
Java 11 기본 Docker 이미지가 왜 그렇게 큰가요? (0) | 2020.08.22 |
Mongo 인터페이스 (0) | 2020.08.22 |
rsync 제외 .gitignore & .hgignore & svn : ignore like --filter = : C (0) | 2020.08.22 |
Hash Rocket은 더 이상 사용되지 않습니까? (0) | 2020.08.22 |