我想在一个循环中使用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"
我无法找到解释为什么会发生这种情况的地方。为什么这个函数不能单独应用于每一轮循环,我该怎么办呢?
答案 0 :(得分:2)
原因是vector
中的一个元素是character
而vector
不能有混合类型。所以,它被强迫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
循环