首页 > 解决方案 > 如何使用 r 通过使用列表从 url 迭代更新字符串来下载多个文件

问题描述

我想从https://biogeo.ucdavis.edu/data/gadm3.6/Rsf/gadm36_AGO_1_sf.rds下载 100 多个文件。url 中唯一更改的字符串是“AGO”,它将被另一个字符串替换,例如从列表中获取的“DZA”。例如,https://biogeo.ucdavis.edu/data/gadm3.6/Rsf/gadm36_DZA_1_sf.rds将下载另一个文件。对于创建一个使用 r 迭代下载并将文件写入工作目录的函数,我将不胜感激。

要迭代的字符串列表:

strin<-structure(list(iso3c = c("DZA", "AGO", "BWA", "BDI", "CMR", "CPV"
)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-6L))

我的尝试:

list1 = strin %>% unlist(.)

for (i in list1){
  urls <- lapply(list1
                 , function(i) paste0("https://biogeo.ucdavis.edu/data/gadm2.8/rds/", i, "_adm2.rds" ) %>% as.character(.)
  )
}

for (u in urls){
  url <- lapply(urls, function(u) GET(u,write_disk(tempfile(fileext = ".RDS")))
  )
}

infolist1 =rownames_to_column(
                  data.frame(
                    as.matrix(
                      unlist(
                        lapply(url, `[`, c('url', 'status_code', 'content'))
                        )
                      )
                    )
                  , var = "rowname")

infolist1$rowname= gsub(".*\\.","",infolist1$rowname) 
colnames(infolist1) = c("rowname", "data1")

c2 = infolist1 %>%  subset(., rowname == "status_code", select = c(data1)) 
c3= infolist1 %>%   subset(., rowname == "content", select = c(data1)) 

infolist1 = cbind(c2,c3)  %>% unlist(.)
rm(list=c('c2', 'c3'))
colnames(infolist1) = c("urlx", "filestatus", "filepath")

#错误信息:

colnames <-(tmp, value = c("urlx", "filestatus", "filepath" 中的错误:尝试在小于二维的对象上设置 'colnames'

标签: rfunctionurl

解决方案


您展示了许多超出标题问题的额外代码。

要下载文件,我会使用download.file

strin<-structure(list(iso3c = c("DZA", "AGO", "BWA", "BDI", "CMR", "CPV"
)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-6L))

for (ss in strin$iso3c)
    download.file(
        paste0("https://biogeo.ucdavis.edu/data/gadm2.8/rds/", ss, "_adm2.rds"),
        paste0(ss, "_adm2.rds"))

"CPV_adm2.rds"这会将所有文件(似乎不存在的文件除外)存储在当前工作文件夹中。


推荐阅读