Урок 5 Обработка ошибок: функции safely(), possibly(), quietly()

5.1 Описание

В этом уроке мы продолжаем обсуждать варианты обработки ошибок на языке R. В этот раз мы рассмотрим возможности пакета retry, а так же познакомимся с некоторыми функциями из пакета purrr, которые так же помогут отловить ошибки и предупреждения.

5.2 Видео

5.3 Тайм коды

Тайм коды: 1. Обработка ошибок с помощью пакета retry (0:36) 2. Обработка ошибок с помощью пакета purrr (5:58) 3. Функция safely() (8:05) 4. Функция possibly() (9:40) 5. Функция quietly() (10:53) 6. Заключение (12:50)

5.4 Код

library(retry)

# тестовая функция 
fun <- function(p = 0) {
  
  x <- runif(1)
  
  if (runif(1) < 0.9) {
    
    print(paste0('X = ', x, ' is Error!'))
    
    Sys.sleep(p)
          
    stop("random error")
  }
  "Excellent"
}

# повторяем функци до тех пор пока она не выполнится
retry(fun(), when = "random error")

# добавим временной интервал между попытками
retry(fun(), when = "random error", interval = 2)

# ограничим количество попыток выполнения функции
retry(fun(), when = "random error", max_tries = 3)

# ограничим время выполнения функции
retry(fun(4), when = "random error", timeout = 2)

# проверяем результат выполнения выражения
# val это выражение которое мы проверяем
# cnd результат вычисления val
retry(fun(), until = function(val, cnd) val == "Excellent")

library(purrr)

# тестовая функция
div <- function(x, y) {
  
  if ( is.na(x) ) warning("X is NA")
  return(x / y)

}

# пробуем обработку через lapply
val <- list(1, 6, 3, NA, 'k', 3)
# тест
lapply(val, div, y = 2)

# ######### #
# safely    #
# ######### #
# разделит успешные результаты и ошибки
res <- lapply(val, safely(div), y = 2)

# разбить ошибкии корректные результаты по векторам
res <- res %>% transpose()

res$result # успешные результаты
res$error  # ошибки

# ######### #
# possibly  #
# ######### #
# данная функция заменит ошибки заданным значением
res <- lapply(val, possibly(div, 0), y = 2) 

# ######### #
# quietly   #
# ######### #
# перехватыет выводимые результаты, сообщения и предупреждения
val <- list(1, 6, 3, NA, 3)
res <- map(val, quietly(div), y = 2) %>% str

5.5 Тест