我在R中调用一个函数
for(i in 1:nrow(ListA)){Produce_Output(ListA$ColumnA[i], ListA$ColumnB[i])}
此函数根据最佳拟合生成ETS或Auto.Arima模型。但是,某些数据不允许使用此模型进行预测,并且会带来错误(可理解)。我想要的是如果函数“ Produce_Output”失败,则可以将变量ColumnA和ColumnB传递给另一个函数的功能。
我可以使用“ Try”来忽略错误,但这不是我要的。查看TryCatch函数,这似乎出现在我需要查看的区域,但是我只能看到有关如何返回句柄的参考,而不是通过传递来激活另一个函数。
答案 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