如果第一个功能在R中失败,则路由到另一个功能

时间:2018-09-03 14:18:36

标签: r exception error-handling try-catch

我在R中调用一个函数

for(i in 1:nrow(ListA)){Produce_Output(ListA$ColumnA[i], ListA$ColumnB[i])} 

此函数根据最佳拟合生成ETS或Auto.Arima模型。但是,某些数据不允许使用此模型进行预测,并且会带来错误(可理解)。我想要的是如果函数“ Produce_Output”失败,则可以将变量ColumnA和ColumnB传递给另一个函数的功能。

我可以使用“ Try”来忽略错误,但这不是我要的。查看TryCatch函数,这似乎出现在我需要查看的区域,但是我只能看到有关如何返回句柄的参考,而不是通过传递来激活另一个函数。

1 个答案:

答案 0 :(得分:0)

尝试以下语法(已更新为可重现的示例:)

ListA <- data.frame(ColumnA = c(1,2,3,4),
                    ColumnB = c("a","b","c","d"),
                    stringsAsFactors = FALSE)

Produce_Output <- function(i,j){
  if(i %in% c(2,4)){
    stop("Error in Produce Output")
  }
  cat(" \n# Produce Output: ", i, j)
}

another_function <- function(i,j){
  cat("\n#another function:", i, j)
}

for(i in 1:nrow(ListA)){
  tryCatch(
    Produce_Output(ListA$ColumnA[i], ListA$ColumnB[i]),
    error = function(ex){
      warning("Had an error - ", ex)
      another_function(ListA$ColumnA[i], ListA$ColumnB[i])
    })

}

哪个产生以下输出:

# Produce Output:  1 a
# another_function: 2 b 
# Produce Output:  3 c
# another_function: 4 dWarning messages:
1: In value[[3L]](cond) :
  Had an error - Error in Produce_Output(ListA$ColumnA[i], ListA$ColumnB[i]): Error in Produce Output

2: In value[[3L]](cond) :
  Had an error - Error in Produce_Output(ListA$ColumnA[i], ListA$ColumnB[i]): Error in Produce Output

通过使用apply()示例避免for循环:

f <- function(x){
  tryCatch(
    Produce_Output(x[["ColumnA"]], x[["ColumnB"]]),
    error = function(ex){
      warning("Had an error - ", ex)
      another_function(x[["ColumnA"]], x[["ColumnB"]])
    })
}

out <- apply(ListA, 1, f)

# Produce Output:  1 a
# another_function: 2 b 
# Produce Output:  3 c
# another_function: 4 dWarning messages:
1: In value[[3L]](cond) :
  Had an error - Error in Produce_Output(ListA$ColumnA[i], ListA$ColumnB[i]): Error in Produce Output

2: In value[[3L]](cond) :
  Had an error - Error in Produce_Output(ListA$ColumnA[i], ListA$ColumnB[i]): Error in Produce Output