2012-09-28 50 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