我试图理解如何在循环中使用tryCatch(),它会跳过任何创建错误的值并移动到循环中的下一个项目。为了理解语法,我创建了一个带有日志的快速循环,如下所示:
i=0
Log<- function(x) {
tryCatch(log(x),
warning = function(w) {i=i+1;next},
error = function(e) {i=i+1;next},
finally={log(x)})
}
for(input in (-5:5)) {
print(paste("log of", input, "=", Log(input)))
}
我试图跳过产生警告或消息的任何日志值(在这种情况下从-5到0)并记录它(因此i = 0,而i = i + 1) )。但是这不起作用,它会产生以下错误:
Error in value[[3L]](cond) : no loop for break/next, jumping to top level
答案 0 :(得分:0)
我发现原始代码存在问题。您在next
内呼叫tryCatch
并且不需要/没有意义。这就是为什么错误消息说没有可以中断的循环,因为在调用next
时你的代码不在循环内。相反,只需在警告或错误时递增计数器,然后从函数外部调用Log()
。试试这段代码:
Log <- function(x) {
tryCatch(log(x),
warning = function(w) {i=i+1},
error = function(e) {i=i+1},
finally = {log(x)})
}
但为什么要在log(x)
区块中再次呼叫finally
?相反,您可以完全省略它。