Как проверить, существует ли файл в ссылке перед использованием download.file в R - PullRequest
1 голос
/ 20 февраля 2020

У меня есть проблема, и я не знаю, как ее решить. У меня есть список URL для прямой загрузки некоторых файлов.

Например.

x<-list("https://www.ecb.europa.eu/paym/coll/assets/html/dla/ea_MID/ea_csv_200219.csv",
"http://sdw.ecb.europa.eu/quickviewexport.do?SERIES_KEY=120.EXR.M.USD.EUR.SP00.A&type=csv")

name_file<-list("name_1.csv","name_2.csv")

В этом случае скрипт ниже работает нормально, но если один или несколько URL не работают, tryCatch не возвращает мне сообщение. Кто-нибудь, пожалуйста, мог бы помочь мне и сказать, где моя ошибка?

  for(i in seq_along(x)) {
  x<-as.character(x[i])
  nse.folder = paste0("directory_files/",name_file[i])
  tryCatch({download.file(x, destfile = nse.folder, method='curl')}, error = function(e) "Error: this url doesn't work!")
  Sys.sleep(4)
  }

Чтобы проверить скрипт, который я вырезал, например, URL, например:

x<-list("https://www.ecb.europa.eu/paym/coll/assets/html/dla/ea_MID/",
"http://sdw.ecb.europa.eu/quickviewexport.do?")

Где следует Я улучшаю код?

Заранее спасибо

1 Ответ

1 голос
/ 20 февраля 2020

Вы можете использовать запрос HEAD. В R это доступно в пакете httr. Коды возврата можно найти в Википедии . Это ТАК сообщение может быть полезным.

Очень простой функцией может быть

urlFileExist <- function(url){
  HTTP_STATUS_OK <- 200
  hd <- httr::HEAD(url)
  status <- hd$all_headers[[1]]$status
  list(exists = status == HTTP_STATUS_OK, status = status)
}

lapply(x, urlFileExist)
#[[1]]
#[[1]]$exists
#[1] TRUE
#
#[[1]]$status
#[1] 200
#
#
#[[2]]
#[[2]]$exists
#[1] TRUE
#
#[[2]]$status
#[1] 200
...