tryCatch 函数中的 while 循环

Posted

技术标签:

【中文标题】tryCatch 函数中的 while 循环【英文标题】:while loop inside tryCatch function 【发布时间】:2017-06-07 01:22:03 【问题描述】:

我正在对置换数据运行 GLMM,对于其中一些数据,我有一条收敛错误消息。 由于这是我的空模型,我只需要重新采样这个特定的置换数据。 因此,我尝试处理 R 的 tryCatch 函数,但我遇到了一些失败。 我有 Perm 这是我的数据帧的置换数据集和 pglmm 这是置换数据的 glmm 模型。所以我有以下结构:

pglmm<-NULL
for (i in seq_along(Perm))
pglmm[[i]]<-summary(lme("My GLMM model"))

为了处理错误我尝试了这个结构

pglmm<-NULL
for (i in seq_along(Perm))
pglmm[[i]]<- tryCatch(summary(lme()),
error=function(err)
pglmm[[i]]<- summary(lme("My GLMM model on resample data"))
return(pglmm[[i]])


目前它正在工作,但即使对出现错误的数据重新采样,我也可能会遇到收敛问题,因此我需要添加一个 while 循环以重新采样,直到不再出现此收敛错误。但是我真的不知道在哪里添加这个 while 循环(在 error=function(err) 内还是应该在启动 for 循环时添加?)。

提前感谢您的帮助。

【问题讨论】:

【参考方案1】:

大概是这样的

pglmm <- vector("list", length(Perm))
for (i in seq_along(pglmm))
    while(is.null(pglmm[[i]])) 
        tryCatch(
            pglmm[[i]] <- summary(lme(...)), 
            error = function(e) print(e); print("retrying...")
        )
    

pglmm 被初始化为与Perm 相同长度的列表,其中填充有NULL 值。遍历列表的每个元素,您可以重复数据重新采样和模型拟合(这是pglmm[[i]]&lt;- ... 行),直到没有收敛错误。模型运行成功后,将其分配给pglmm 的第i 个条目,然后循环继续执行下一个索引,依此类推。

【讨论】:

【参考方案2】:

预分配和填充,成功时增加迭代器而不是迭代序列

pglmm <- vector("list", length(Perm))
i <- 1
while (i <= length(Perm)) 
    pglmm[[i]] = tryCatch(summary(lme(...)), error=identity)
    if (!is(pglmm[[i]], "error"))
        i <- i + 1

或避免使用管理内存的需要

pglmm <- replicate(length(Perm), 
    repeat 
        result <- tryCatch(summary(lme(...)), error=identity)
        if (!is(result, "error"))
            break
    
    result
)

【讨论】:

喜欢重复解决方案

以上是关于tryCatch 函数中的 while 循环的主要内容,如果未能解决你的问题,请参考以下文章

我将如何定义一个其中有一个while循环和一个try-except循环的函数?

try 或 tryCatch 与引导 R

为啥不建议用 try catch

C 回调中的 try catch(...) - 坏主意?

为啥不建议用 try catch

C#、While 循环、尝试捕获、记录、继续