如何在 R 中使用 download.file 之前检查 url 中是否存在文件

How to check If file exists in the url before use download.file in R

我有一个问题,我不知道如何解决。 我有列表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 不会 return 向我发送消息。有人可以帮助我并告诉我我的错误在哪里吗?

  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?")

我应该在哪里改进代码?

提前致谢

您可以使用 HEAD 请求。在 R 中,它在包 httr 中可用。 return 代码可以在 Wikipedia. This SO post 上找到,可能会有用。

一个非常简单的函数可以是

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