Урок 5 Обработка ошибок: функции safely(), possibly(), quietly()
5.1 Описание
В этом уроке мы продолжаем обсуждать варианты обработки ошибок на языке R. В этот раз мы рассмотрим возможности пакета retry, а так же познакомимся с некоторыми функциями из пакета purrr, которые так же помогут отловить ошибки и предупреждения.
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