Как написать trycatch в R

Я хочу написать код trycatch чтобы иметь дело с ошибкой при загрузке из Интернета.

 url <- c( "http://stat.ethz.ch/R-manual/R-devel/library/base/html/connections.html", "http://en.wikipedia.org/wiki/Xz") y <- mapply(readLines, con=url) 

Эти два утверждения успешно выполняются. Ниже я создаю не существующий веб-адрес:

 url <- c("xxxxx", "http://en.wikipedia.org/wiki/Xz") 

url[1] не существует. Как написать цикл trycatch (function), чтобы:

  1. Когда URL-адрес ошибочен, вывод будет следующим: «URL-адрес в Интернете неправильный, не может быть».
  2. Когда URL-адрес неверен, код не останавливается, но продолжает загружаться до конца списка URL-адресов?

Ну тогда: добро пожаловать в мир Р;;)

Ну вот

Настройка кода

 urls <- c( "http://stat.ethz.ch/R-manual/R-devel/library/base/html/connections.html", "http://en.wikipedia.org/wiki/Xz", "xxxxx" ) readUrl <- function(url) { out <- tryCatch( { # Just to highlight: if you want to use more than one # R expression in the "try" part then you'll have to # use curly brackets. # 'tryCatch()' will return the last evaluated expression # in case the "try" part was completed successfully message("This is the 'try' part") readLines(con=url, warn=FALSE) # The return value of `readLines()` is the actual value # that will be returned in case there is no condition # (eg warning or error). # You don't need to state the return value via `return()` as code # in the "try" part is not wrapped insided a function (unlike that # for the condition handlers for warnings and error below) }, error=function(cond) { message(paste("URL does not seem to exist:", url)) message("Here's the original error message:") message(cond) # Choose a return value in case of error return(NA) }, warning=function(cond) { message(paste("URL caused a warning:", url)) message("Here's the original warning message:") message(cond) # Choose a return value in case of warning return(NULL) }, finally={ # NOTE: # Here goes everything that should be executed at the end, # regardless of success or error. # If you want more than one expression to be executed, then you # need to wrap them in curly brackets ({...}); otherwise you could # just have written 'finally=' message(paste("Processed URL:", url)) message("Some other message at the end") } ) return(out) } , urls <- c( "http://stat.ethz.ch/R-manual/R-devel/library/base/html/connections.html", "http://en.wikipedia.org/wiki/Xz", "xxxxx" ) readUrl <- function(url) { out <- tryCatch( { # Just to highlight: if you want to use more than one # R expression in the "try" part then you'll have to # use curly brackets. # 'tryCatch()' will return the last evaluated expression # in case the "try" part was completed successfully message("This is the 'try' part") readLines(con=url, warn=FALSE) # The return value of `readLines()` is the actual value # that will be returned in case there is no condition # (eg warning or error). # You don't need to state the return value via `return()` as code # in the "try" part is not wrapped insided a function (unlike that # for the condition handlers for warnings and error below) }, error=function(cond) { message(paste("URL does not seem to exist:", url)) message("Here's the original error message:") message(cond) # Choose a return value in case of error return(NA) }, warning=function(cond) { message(paste("URL caused a warning:", url)) message("Here's the original warning message:") message(cond) # Choose a return value in case of warning return(NULL) }, finally={ # NOTE: # Here goes everything that should be executed at the end, # regardless of success or error. # If you want more than one expression to be executed, then you # need to wrap them in curly brackets ({...}); otherwise you could # just have written 'finally=' message(paste("Processed URL:", url)) message("Some other message at the end") } ) return(out) } 

Применение кода

 > y <- lapply(urls, readUrl) Processed URL: http://stat.ethz.ch/R-manual/R-devel/library/base/html/connections.html Some other message at the end Processed URL: http://en.wikipedia.org/wiki/Xz Some other message at the end URL does not seem to exist: xxxxx Here's the original error message: cannot open the connection Processed URL: xxxxx Some other message at the end Warning message: In file(con, "r") : cannot open file 'xxxxx': No such file or directory 

Исследование выхода

 > head(y[[1]]) [1] "" [2] "R: Functions to Manipulate Connections" [3] "" [4] "" [5] "" [6] "" > length(y) [1] 3 > y[[3]] [1] NA 

Дополнительные замечания

попробуй поймать

tryCatch возвращает значение, связанное с выполнением expr если нет ошибки или предупреждения. В этом случае конкретные возвращаемые значения (см. return(NA) выше) могут быть заданы путем предоставления соответствующей функции обработчика (см. Аргументы error и warning in ?tryCatch ). Это могут быть уже существующие функции, но вы также можете определить их в tryCatch() (как я уже tryCatch() выше).

Последствия выбора конкретных возвращаемых значений функций обработчика

Поскольку мы указали, что NA следует возвращать в случае ошибки, третьим элементом в y является NA . Если бы мы выбрали NULL как возвращаемое значение, длина y бы равна 2 вместо 3 как lapply() просто «игнорирует» возвращаемые значения, которые являются NULL . Также обратите внимание, что если вы не укажете явное возвращаемое значение через return() , функции обработчика вернут NULL (т. Е. В случае ошибки или предупреждения).

Предупреждение "Нежелательное"

Поскольку warn=FALSE , похоже, не имеет никакого эффекта, альтернативный способ подавить предупреждение (которое в данном случае не представляет особого интереса) заключается в использовании

 suppressWarnings(readLines(con=url)) 

вместо

 readLines(con=url, warn=FALSE) 

Несколько выражений

Обратите внимание, что вы также можете размещать несколько выражений в «действительной части выражений» (аргумент expr из tryCatch() ), если вы tryCatch() их в фигурные скобки (как я проиллюстрировал в finally части).

R использует функции для реализации блока try-catch:

Синтаксис выглядит примерно так:

 result = tryCatch({ expr }, warning = function(warning_condition) { warning-handler-code }, error = function(error_condition) { error-handler-code }, finally={ cleanup-code }) 

В tryCatch () есть два условия: «предупреждения» и «ошибки». Важное значение для понимания при написании каждого блока кода – это состояние выполнения и область действия. @источник

Вот простой пример :

 # Do something, or tell me why it failed my_update_function <- function(x){ tryCatch( # This is what I want to do: y = x * 2 return(y) , # ... but if an error occurs, tell me what happened: error=function(error_message) { message("My message is here!") message("And below is the error message from R:") message(error_message) return(NA) } ) } 

Если вы также хотите зафиксировать «предупреждение», просто добавьте warning= аналогично error= part.

Поскольку я просто потерял два дня своей жизни, пытаясь решить для tryCatch функцию irr, я думал, что должен поделиться своей мудростью (и чего не хватает). FYI – irr – это реальная функция от FinCal, в этом случае, когда в большом количестве данных были получены ошибки в нескольких случаях.

  1. Настройте tryCatch как часть функции. Например:

     irr2 <- function (x) { out <- tryCatch(irr(x), error = function(e) NULL) return(out) } 
  2. Чтобы ошибка (или предупреждение) работала, вам действительно нужно создать функцию. Я изначально для части ошибки просто написал error = return(NULL) а ВСЕ значения вернулись в нуль.

  3. Не забудьте создать суб-выход (например, мой «выход») и return(out) .

  • Почему попытка {...} наконец {...} хорошая; try {...} catch {} bad?
  • Будет ли код в объявлении finally загораться, если я верну его значение в блоке Try?
  • Выполняется ли блок C # «finally» ВСЕГДА?
  • Почему я не должен обертывать каждый блок в «try» - «catch»?
  • Программа зависает во время Thread.sleep () и с таймером
  • Почему блок Try / Catch создает новую область переменных?
  • Зачем ловить и реконструировать исключение в C #?
  • Не пытайтесь ли вы блокировать блокировки, если исключения не выбрасываются?
  • Java, если vs. try / catch
  • try / catch + using, правильный синтаксис
  • Эквивалент Try-with-resources в Java 1.6
  • Давайте будем гением компьютера.