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/