保存使用tryCatch

时间:2015-08-18 15:21:41

标签: r

我正在尝试使用tryCatch返回已评估的表达式以及它生成的警告。我还想在不对表达式进行两次评估的情况下这样做。 这是一个非常简单的例子:

x <- -1
info <- tryCatch(sqrt(x),
                 error = function(e) e
                 warning = function(w) w)

此处info最终成为捕获的警告,我还希望得到NaN生成的sqrt(x)

这个应用程序是我适合的模型,我想知道弹出的警告,但我也只想评估模型一次。如果我可以适合它两次,我可以检查信息是否是一个警告然后只是重新安装它,但是适合模型两次是禁止的。

1 个答案:

答案 0 :(得分:3)

请参阅demo(error.catching),其中提供了以下内容

##' Catch *and* save both errors and warnings, and in the case of
##' a warning, also keep the computed result.
##'
##' @title tryCatch both warnings (with value) and errors
##' @param expr an \R expression to evaluate
##' @return a list with 'value' and 'warning', where
##'   'value' may be an error caught.
##' @author Martin Maechler;
##' Copyright (C) 2010-2012  The R Core Team
tryCatch.W.E <- function(expr)
{
    W <- NULL
    w.handler <- function(w){ # warning handler
      W <<- w
      invokeRestart("muffleWarning")
    }
    list(value = withCallingHandlers(tryCatch(expr, error = function(e) e),
                                   warning = w.handler),
       warning = W)
}

在您的示例中

tryCatch.W.E(sqrt(-1))
#> $value
#> [1] NaN
#> 
#> $warning
#> <simpleWarning in sqrt(-1): NaNs produced>