我正在尝试使用tryCatch
返回已评估的表达式以及它生成的警告。我还想在不对表达式进行两次评估的情况下这样做。
这是一个非常简单的例子:
x <- -1
info <- tryCatch(sqrt(x),
error = function(e) e
warning = function(w) w)
此处info
最终成为捕获的警告,我还希望得到NaN
生成的sqrt(x)
。
这个应用程序是我适合的模型,我想知道弹出的警告,但我也只想评估模型一次。如果我可以适合它两次,我可以检查信息是否是一个警告然后只是重新安装它,但是适合模型两次是禁止的。
答案 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>