如何重新启动一个循环与Eval在R中超时?

问题描述:

while (!exists("j")) { 
    i <- 1 

    repeat { 
     tryCatch(expr = { 
      print(i) 

      raw.result <- evalWithTimeout(Sys.sleep(i), timeout = 3) 

      if (i == 1) { 
       j <- i 
      } else { 
       j <- c(j, i) 
      } 

      i <- i + 1 
     }, TimeoutException = function(ex) { 
      rm("j") 
     }) 
    } 
} 

上述代码卡在i=4,并继续执行i=4的功能,但是我希望它从i=1重新启动,只要出现错误。如何重新启动一个循环与Eval在R中超时?

有人可以请指导我在哪里做错了?

在您的代码TimeoutException无法找到j,因为它在不同的环境中进行评估。即使它能够找到它,也不会改变。由于tryCatch正在停止从打破repeat循环中的错误,因此repeat将继续与当前i。您可以明确从repeat中跳出,但在这种情况下,您已删除j,因此您的while将停止。

我不太清楚为什么你需要while循环这里。

这是您的代码的修改,将按您的需要工作。 明确设置i <- 1,并再次将其重新设置为i <<-1(注意<<-,因为i是tryCatch之上的一个环境)。

i <- 1 

repeat { 
    tryCatch(
    expr = { 
     print(i) 

     raw.result <- R.utils:evalWithTimeout(Sys.sleep(i), timeout = 3) 

     if (i == 1) { 
     j <- i 
     } else { 
     j <- c(j, i) 
     } 

     i <- i + 1 
    }, 
    TimeoutException = function(ex) { 
     i <<- 1 
    } 
) 
}