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]]<- ...
行),直到没有收敛错误。模型运行成功后,将其分配给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 循环的主要内容,如果未能解决你的问题,请参考以下文章