IT이야기

함수 호출로 인해 경고가 발생하는지 확인

cyworld 2021. 4. 16. 21:32
반응형

함수 호출로 인해 경고가 발생하는지 어떻게 확인할 수 있습니까?


R에서 함수 호출로 인해 경고가 발생하는지 어떻게 확인할 수 있습니까?

즉, 함수를 호출 한 후 해당 호출의 인스턴스가 경고를 생성했는지 여부를 알고 싶습니다.


try구성 을 사용하려는 경우 경고 옵션을 설정할 수 있습니다. 을 (를) 참조하십시오 ?options. 사용하는 것이 더 좋습니다 tryCatch().

x <- function(i){
  if (i < 10) warning("A warning")
  i
}

tt <- tryCatch(x(5),error=function(e) e, warning=function(w) w)

tt2 <- tryCatch(x(15),error=function(e) e, warning=function(w) w)

tt
## <simpleWarning in x(5): A warning>

tt2
## [1] 15

if(is(tt,"warning")) print("KOOKOO")
## [1] "KOOKOO"

if(is(tt2,"warning")) print("KOOKOO")

결과와 경고를 모두 얻으려면 다음을 수행하십시오.

tryCatch(x(5),warning=function(w) return(list(x(5),w)))

## [[1]]
## [1] 5
## 
## [[2]]
## <simpleWarning in x(5): A warning>

사용 try

op <- options(warn=2)

tt <- try(x())
ifelse(is(tt,"try-error"),"There was a warning or an error","OK")
options(op)

R-help 메일 링리스트 ( http://tolstoy.newcastle.edu.au/R/help/04/06/0217.html 참조 )에서 Luke Tierney는 다음과 같이 썼습니다.

"값을 계산하고 모든 경고를 수집하는 함수를 작성하려면 다음과 같이 할 수 있습니다.

withWarnings <- function(expr) {
    myWarnings <- NULL
    wHandler <- function(w) {
        myWarnings <<- c(myWarnings, list(w))
        invokeRestart("muffleWarning")
    }
    val <- withCallingHandlers(expr, warning = wHandler)
    list(value = val, warnings = myWarnings)
} 

다음은 예입니다.

testit <- function() warning("testit") # function that generates warning.

assign("last.warning", NULL, envir = baseenv()) # clear the previous warning

testit() # run it

if(length(warnings())>0){ # or !is.null(warnings())
    print("something happened")
}

어쩌면 이것은 간접적 일 수도 있지만 더 간단한 방법을 모르겠습니다.


2019 업데이트

출력, 결과, 경고 및 오류 목록을 반환하는 purrr 패키지에서 '조용히'를 사용할 수 있습니다. 그런 다음 각 요소를 이름으로 추출 할 수 있습니다. 예를 들어 함수를 매핑하려는 목록이 있고 경고를 반환 한 요소를 찾으면 다음을 수행 할 수 있습니다.

library(purrr)
library(lubridate)

datelist <- list(a = "12/12/2002", b = "12-12-2003", c = "24-03-2005")

# get all the everything
quiet_list <- map(datelist, quietly(mdy))

# find the elements which produced warnings
quiet_list %>% map("warnings") %>% keep(~ !is.null(.))

# or 
quiet_list %>% keep(~ length(.$warnings) != 0)

이 예제에서는 매우 사소하지만 NA를 찾기 어려울 수있는 긴 데이터 프레임 목록의 경우 매우 유용합니다.

참조 URL : https://stackoverflow.com/questions/3903157/how-can-i-check-whether-a-function-call-results-in-a-warning

반응형