r - 如何在R中用超时重启eval的循环?

标签 r error-handling try-catch

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重新启动。

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

最佳答案

在您的代码中,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
    }
  )
}

关于r - 如何在R中用超时重启eval的循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42645971/

相关文章:

c++ - 构造函数中引发的异常的处理程序是什么?

javascript - 在 rmarkdown 中切换 dygraph 的对数刻度选项

r - 在 R 中有效地居中大型矩阵

php - PHP中的http_response_code()

php - 如何捕捉 ZF2 Controller 中的异常?

c++ - 如果抛出的值匹配多个 catch 子句会发生什么?

r - 从环境中获取 xts 对象

r - 带有躲避条形图的 geom_text

c++ - 提供虚函数错误

javascript - 如何检测是否在Promise的catch block 中