如何重新启动一个循环与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
}
)
}