【发布时间】:2017-01-15 07:28:10
【问题描述】:
如果 for 循环内的操作出错,我正在寻找一种简单的方法来继续 R 中 for 循环中的下一次迭代。
我在下面重新创建了一个简单的案例:
for(i in c(1, 3)) {
test <- try(i+1, silent=TRUE)
calc <- if(class(test) %in% 'try-error') {next} else {i+1}
print(calc)
}
这正确地给了我以下计算值。
[1] 2
[1] 4
但是,一旦我将 i 中的向量更改为包含非数字值:
for(i in c(1, "a", 3)) {
test <- try(i+1, silent=TRUE)
calc <- if(class(test) %in% 'try-error') {next} else {i+1}
print(calc)
}
这个 for 循环不起作用。我希望得到与上面相同的计算值,向量不包括 i 中的非数字值。
我尝试使用 tryCatch 如下:
for(i in c(1, "a", 3)) {
calc <- tryCatch({i+1}, error = function(e) {next})
print(calc)
}
但是,我收到以下错误:
Error in value[[3L]](cond) : no loop for break/next, jumping to top level
有人可以帮我理解如何在 R 中使用 for 循环来实现这一点吗?
【问题讨论】:
-
您可能想检查
c(1, "a", 3)的实际含义。我认为您认为只有中间元素是字符,但这是不正确的。 -
我不确定你为什么要这样做。这是一个简化的例子吗?如果不是,那么仅在输入向量上使用
as.numeric将使字符变为 NA。玩弄它as.numeric(c(1, "k", "3")) + 1 -
@Dason 实际上,我对 for 循环示例中控制流的错误处理更感兴趣,因为这只是我拥有的较大脚本的简化案例。我只是通过放置一个字符元素来重新创建一个抛出“错误”的场景,从而违反了 i 中向量的定义。希望这能澄清我的问题。
-
您在示例中创建的问题是您创建了所有错误。你没有留下一个好的案例。
-
你想从中得到什么输出?你想要一个错误所在的向量,还是一个有效结果的向量?
标签: r for-loop error-handling try-catch next