在循环中使用R的tryCatch函数

时间:2018-04-22 13:42:55

标签: r loops error-handling

我想在一个循环中使用tryCatch函数,它有时可以工作,但有时它不会,我不知道它在哪里有错误来解决问题并创建一个始终有效的循环。所以我希望它只是忽略错误并进入下一轮。例如,为了简化问题,我有x,我希望每个值都有sqrt。我写道:

x <- c(1,2,"a" , 4)
for (i in x) {
  y <- tryCatch(print(sqrt(i)) , error= function(e) {return(0)}  )
  if (y==0) {print("NOT POSSIBLE")
             next}
}

我想这段代码应该给我这个答案:

[1] 1
[1] 1.414214
[1] "NOT POSSIBLE"
[1] 2

但它给了我这个:

[1] "NOT POSSIBLE"
[1] "NOT POSSIBLE"
[1] "NOT POSSIBLE"
[1] "NOT POSSIBLE"

我无法找到解释为什么会发生这种情况的地方。为什么这个函数不能单独应用于每一轮循环,我该怎么办呢?

1 个答案:

答案 0 :(得分:2)

原因是vector中的一个元素是charactervector不能有混合类型。所以,它被强迫character。相反,我们应该有一个list,其中每个元素可以有不同的type s

x <- list(1,2,"a" , 4)

现在,运行OP'代码给出了

for (i in x) {
   y <- tryCatch(print(sqrt(i)) , error= function(e) {return(0)}  )
   if (y==0) {print("NOT POSSIBLE")
              next}
 }
#[1] 1
#[1] 1.414214
#[1] "NOT POSSIBLE"
#[1] 2

如果我们只能使用vector,那么应该有一个规定在循环中将其转换为numeric,但它也会为第三个元素返回NA

as.numeric('a')
#[1] NA
  

警告讯息:强制引入的NAs

并结束for循环