2012-09-28 47 views
0

我需要在不干扰生成它们的混合 模型的操作的情况下捕获警告(在R中)。到目前为止,我已经看到了这两种变化。在 一个情况下,如果发生错误,导致该模型摔倒,我高兴地 能够记录从这些实例安装对象时,模型运行是SUCESSFUL穿插了失败的记录:诱骗警告,但不会将它们转换为错误

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

在第二种情况下,我可以使用选项(警告= 2)将警告更改为错误,并使用类似于上述语法的 。不过,我看不出如何记录这两个安装 对象和收敛即的状态,​​至少两次警告出现,无论是

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

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

,我想成为能够将收敛状态与模型参数相关联。 所以基本上我想知道如何捕捉警告,而不会将它们转换成 错误。我已经试过的options(warn=1)suppressMessages,并sink(…, type(“output”,”message”))组合与cat()语句从模型函数产生一个迭代/集ID ,但只写了连续的ID来文件,而 在标准输出的警告。

回答

0

很难从复杂的例子说,但也许

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)。在?warning上提到muffleWarning

+0

非常感谢马丁 - 我不确定创建的警告和从模型运行生成的标准警告之间的区别 - 请参阅我的原始帖子中的示例。如果存储这样的警告,你的代码将如何改变? – user1704815

+0

我不太确定我的理解。 'CustomlmerFnctn'可能会通过说出警告(“单数收敛(7)”)或类似的方式来产生警告,并且警告将按照我的回答进行处理。也许如果你提供了一个容易重现的例子,它会更清晰? –

+0

我想我的意思是,你只需要从警告调用中移除“oops”,如下所示,警告=功能(w),警告函数(w) {“append(warn,conditionMessage(w)) invokeRestart(”muffleWarning“) }) – user1704815