【问题标题】:Trapping warnings without translating them to errors捕获警告而不将其转换为错误
【发布时间】:2012-09-28 02:54:39
【问题描述】:

我需要在不干扰混合操作的情况下捕获警告(在 R 中) 生成它们的模型。到目前为止,我已经研究了两种变体。在 一种情况,发生错误导致模型翻倒,我很高兴 能够在模型运行成功时记录来自这些实例的拟合对象,并散布故障记录:

storOutcomes<-lapply(1:50, function(i)tryCatch(CustomlmerFnctn(Datasets[[i]]),
error=function(e) NULL )) 

在第二种情况下,我可以使用 options(warn=2) 将警告更改为错误并使用 类似于上面的语法。但是,我看不到如何记录拟合的 对象和收敛状态,即至少出现两个警告

“In mer_finalize (ans) : singular convergence (7)”

“In mer_finalize (ans) : false convergence (8)“

我希望能够将收敛状态与模型参数联系起来。 所以基本上我想知道如何捕获警告而不将它们翻译成 错误。我尝试了 options(warn=1)suppressMessagessink(…, type(“output”,”message”))cat() 语句的组合,生成迭代/数据集 ID 来自模型函数,但这只会将连续的 ID 写入文件,留下 标准输出上的警告。

【问题讨论】:

    标签: r


    【解决方案1】:

    从你复杂的例子中很难看出,但也许

    warn <- NULL
    value <- withCallingHandlers({
        warning("oops")
        1 + 2
    }, warning = function(w) {
        warn <<- append(warn, conditionMessage(w))
        invokeRestart("muffleWarning")
    })
    

    导致

    > warn
    [1] "oops"
    > value
    [1] 3
    

    这也在?withCallingHandlers 及其附加文档demo(error.catching) 上进行了说明。 muffleWarning?warning 上被提及。

    【讨论】:

    • 非常感谢 Martin - 我不确定创建的警告和模型运行生成的标准警告之间的区别 - 请参阅我原始帖子中的示例。如果存储这样的警告,您的代码将如何变化?
    • 我不确定我是否理解; CustomlmerFnctn 可能会通过说 warning("singular convergence (7)") 或类似名称来生成警告,并且该警告将按照我的回答进行处理。如果您提供一个易于重现的示例,也许会更清楚?
    • 我想我的意思是你只需要从警告调用中删除“oops”,如下所示 warn
    • 再次感谢马丁 - 当我用我的真实示例尝试你的建议时,它没有像我预期的那样生成警告,所以我认为代码需要一些调整 - 我现在可以工作了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    相关资源
    最近更新 更多