如果函数出错,请再次尝试该迭代 (R)

If a function gives error try that iteration again (R)

Whosebug 上有类似的问题,但是,我找不到与我的问题相同(或相似)的解决方案。我 运行 在 R

中进行如下模拟
 iterSim <- 1000

 for(i in 1:iterSim){


 #Generate some random data
    Z <- NormalDGP(n=T, beta=coef_min, theta=Theta, rho=Rho, ...)

    y <- Z[1:(length(Z[,1])-1),1]
    x <- Z[2:length(Z[,1]),2]

 #Conduct the following tests! However, Dec_POS_Dep sometimes gives an error

    Dec_POS_Dep <- POS_Dep(y, x, simul=TRUE, trueBeta=coef_min, ...)
    Dec_POS_Fix <- POS_Fix(y, x, simul=TRUE, trueBeta=coef_min, ...)
    Dec_CD_95 <- CD_95(y, x, simul=TRUE)

 }

每次迭代都会生成 i 个随机数,三个测试是 运行 - 即 Dec_POS_Dep、Dec_POS_Fix 和 Dec_CD_95。不幸的是,有时在模拟中 Dec_POS_Dep 给出错误并且模拟终止。如果出现错误,我不是在寻找跳过迭代的循环(根据 Whosebug 上的许多建议);但是,我希望重复该迭代。例如。如果代码在第 265 次迭代中并且 Dec_Pos_Dep 给出错误,我希望它在第 265 次迭代时给它更多的镜头。对此的一些解决方案将不胜感激。

这里有两件事很突出:

  1. 使用 try(如 MartinGal 建议的那样)或 tryCatch 将允许事情继续进行。至于重新 运行 迭代,你需要以某种方式跟踪这些失败的 运行s 和 运行 他们自己,没有告诉 R 重复 for循环迭代。
  2. 您在每次迭代中都丢弃了数据,Dec_CD_95 每次都会被覆盖。也许你的意思是把东西放在身边?

这里有一个建议:

iterSim <- 1000
out <- list()
while (length(out) < iterSim) {
   try({
     #Generate some random data
     Z <- NormalDGP(n=T, beta=coef_min, theta=Theta, rho=Rho, ...)
     y <- Z[1:(length(Z[,1])-1),1]
     x <- Z[2:length(Z[,1]),2]
     #Conduct the following tests! However, Dec_POS_Dep sometimes gives an error
     Dec_POS_Dep <- POS_Dep(y, x, simul=TRUE, trueBeta=coef_min, ...)
     Dec_POS_Fix <- POS_Fix(y, x, simul=TRUE, trueBeta=coef_min, ...)
     Dec_CD_95 <- CD_95(y, x, simul=TRUE)
     out <- c(out, list(Dec_POS_Dep, Dec_POS_Fix, Dec_CD_95))
  }, silent = TRUE)
}

诚然,这有点草率,但它应该始终以 1000 次模拟迭代结束。