while循环里面的tryCatch函数

Bas*_*Bas 4 r try-catch while-loop

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

pglmm<-NULL
for (i in seq_along(Perm)){
pglmm[[i]]<-summary(lme("My GLMM model"))
}
Run Code Online (Sandbox Code Playgroud)

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

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]])
}
}
Run Code Online (Sandbox Code Playgroud)

现在它正在工作,但即使通过重新采样一旦我有错误的数据我可能有收敛问题所以我需要添加一个while循环以重新采样,直到这个收敛错误不再出现.但是我真的不知道在while循环中添加这个位置(内部错误=函数(错误),还是应该在启动for循环时?).

预先感谢您的帮助.

Mar*_*gan 6

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

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
}
Run Code Online (Sandbox Code Playgroud)

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

pglmm <- replicate(length(Perm), {
    repeat {
        result <- tryCatch(summary(lme(...)), error=identity)
        if (!is(result, "error"))
            break
    }
    result
})
Run Code Online (Sandbox Code Playgroud)