for 循环中的 tryCatch

tryCatch within for loop

我是R新手,网上查了大部分链接,还是没能解决问题。 这是我正在做的 Monte Carlo 模拟的可重现示例:

rm(list = ls())
x=c(-2,3,-1,4,'A')
y=rep(0,5)

for(i in 1:5){
  tryCatch(
    expr = {
      y[i]=log(x[i])
    },
    error = function(e){
      message('Caught an error!',i)
      return(NA)
    },
    warning = function(w){
      message('Caught an warning!',i)
      return(NA)
    }
  ) 

}

请问我该如何修正代码,以便在 for 循环结束时,R returns y 的值是

y= NA,log(3),NA,log(4),NA
i=1,3,5

以及出现错误或警告的 i 的值。 也就是说,错误和警告被替换为 NA 并返回成功的评估,并且还返回出现错误或警告的 i 的值。

谢谢

NA 初始化 y,然后 运行 for 循环。此外,由于 x 是一个向量,而向量只能容纳一个 class,因此 x 中的所有数字都将转换为字符,因为 x 中有非数字元素,因此您需要在取 log.

之前将它们转换为数字
x=c(-2,3,-1,4,'A')
y=rep(NA,5)

for(i in 1:5){
  tryCatch(
    expr = {
      y[i]= log(as.numeric(x[i]))
    },
  error = function(e){
      message('Caught an error!',i)
   },
  warning = function(w){
      message('Caught a warning! ',i)
    }
  ) 
}
#Caught a warning! 1
#Caught a warning! 3
#Caught a warning! 5

y
#[1]       NA 1.098612       NA 1.386294       NA

然后使用 is.nawhich 来获取发生错误或警告的索引。

which(is.na(y))
#[1] 1 3 5

当然,你也可以不使用 for 循环

y <- log(as.numeric(x))
which(is.na(y))
#[1] 1 3 5

return基于错误或警告的不同值,我们可以把它做成一个函数

run_fun <- function(x) {
   tryCatch(
     expr = {
      return(log(as.numeric(x)))
     },
     error = function(e){
       message('Caught an error!',i)
       return(100)
      },
      warning = function(w){
        message('Caught a warning! ',i)
        return(200)
       }
      ) 
 }

然后在for循环中调用它。

for (i in seq_along(x)) {
   y[i] <- run_fun(x[i])
}

y
#[1] 200.0000   1.0986 200.0000   1.3863 200.0000