>

lapply 를 사용하고 있습니다  많은 수의 항목에 대해 복잡한 기능을 실행하고 각 항목의 출력 (있는 경우)을 생성 된 경고/오류와 함께 저장하여 어떤 항목이 어떤 경고/오류를 생성했는지 알 수 있도록하고 싶습니다.

withCallingHandlers 를 사용하여 경고를 잡는 방법을 찾았습니다  ( 여기에 설명 ). 그러나 오류도 잡아야합니다. tryCatch 에 싸서 할 수 있어요  (아래 코드와 같이) 더 좋은 방법이 있습니까?

catchToList <- function(expr) {
  val <- NULL
  myWarnings <- NULL
  wHandler <- function(w) {
    myWarnings <<- c(myWarnings, w$message)
    invokeRestart("muffleWarning")
  }
  myError <- NULL
  eHandler <- function(e) {
    myError <<- e$message
    NULL
  }
  val <- tryCatch(withCallingHandlers(expr, warning = wHandler), error = eHandler)
  list(value = val, warnings = myWarnings, error=myError)
}

이 기능의 샘플 출력은 다음과 같습니다 :

> catchToList({warning("warning 1");warning("warning 2");1})
$value
[1] 1
$warnings
[1] "warning 1" "warning 2"
$error
NULL
> catchToList({warning("my warning");stop("my error")})
$value
NULL
$warnings
[1] "my warning"
$error
[1] "my error"

tryCatch 를 논의하기 위해 여기에 몇 가지 질문이 있습니다.  오류 처리,하지만이 특정 문제를 해결하는 것을 찾지 못했습니다. 함수 호출로 인해 경고가 발생하는지 어떻게 확인할 수 있습니까? , warnings ()가 함수 내에서 작동하지 않습니까? 이 문제를 어떻게 해결할 수 있습니까? 및 오류를 무시하고 목록에서 다음 사항을 처리하도록 lapply에 알리는 방법 가장 관련성 높은 것들을 위해


  • 답변 # 1

    아마도 이것은 당신의 해결책과 동일하지만, 나는 factory 를 썼습니다.  평범한 오래된 함수를 값, 오류 및 경고를 캡처하는 함수로 변환하여

    test <- function(i)
        switch(i, "1"=stop("oops"), "2"={ warning("hmm"); i }, i)
    res <- lapply(1:3, factory(test))
    
    

    값, 오류 및/또는 경고가 포함 된 결과의 각 요소 사용자 기능, 시스템 기능 또는 익명 기능 ( factory(function(i) ...) )에서 작동합니다. ). 여기 공장이 있습니다

    factory <- function(fun)
        function(...) {
            warn <- err <- NULL
            res <- withCallingHandlers(
                tryCatch(fun(...), error=function(e) {
                    err <<- conditionMessage(e)
                    NULL
                }), warning=function(w) {
                    warn <<- append(warn, conditionMessage(w))
                    invokeRestart("muffleWarning")
                })
            list(res, warn=warn, err=err)
        }
    
    

    결과 목록을 다루는 일부 도우미

    .has <- function(x, what)
        !sapply(lapply(x, "[[", what), is.null)
    hasWarning <- function(x) .has(x, "warn")
    hasError <- function(x) .has(x, "err")
    isClean <- function(x) !(hasError(x) | hasWarning(x))
    value <- function(x) sapply(x, "[[", 1)
    cleanv <- function(x) sapply(x[isClean(x)], "[[", 1)
    
    

  • 답변 # 2

    평가판을 사용해보십시오.

    library(evaluate)
    test <- function(i)
        switch(i, "1"=stop("oops"), "2"={ warning("hmm"); i }, i)
    t1 <- evaluate("test(1)")
    t2 <- evaluate("test(2)")
    t3 <- evaluate("test(3)")
    
    

    현재 표현을 평가할 수있는 좋은 방법이 부족하다. 이것은 주로 콘솔에서 R 출력에 주어진 텍스트 입력을 정확히 재현하는 것을 목표로하기 때문이다.

    replay(t1)
    replay(t2)
    replay(t3)
    
    

    또한 메시지를 캡처하고 콘솔에 출력하며 모든 것이 발생한 순서대로 올바르게 인터리브되도록합니다.

  • 이전 ios - Swift에서 UITableView에 새 셀을 삽입하는 방법
  • 다음 php - 날짜가 주어진 범위에 있는지 확인하는 방법?