Маршрутизация к другой функции, если первая функция не работает в R - PullRequest
0 голосов
/ 03 сентября 2018

Я вызываю функцию в R

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

Эта функция создает модель ETS или Auto.Arima на основе наилучшего соответствия. Однако некоторые данные не позволяют прогнозировать с использованием этой модели и возвращают ошибки (понятно). Что мне хотелось бы, так это возможность передавать переменные ColumnA и ColumnB другой функции, если функция «Produce_Output» завершается сбоем.

Я могу использовать «Попробуйте», чтобы просто игнорировать ошибки, но это не то, что я хочу. Глядя на функцию TryCatch, это кажется (возможно) той областью, на которую мне нужно обратить внимание, однако я вижу только ссылки на то, как вернуть дескрипторы, а не передать их для активации другой функции.

1 Ответ

0 голосов
/ 03 сентября 2018

Попробуйте этот синтаксис (обновлен до воспроизводимого примера:)

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

Как избежать цикла for, используя apply() пример:

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
...