r — загрузка нескольких файлов в отдельные подпапки с помощью foreach — ошибка с setwd

У меня есть следующий код, который загружает ссылку в соответствующую папку › подпапку. Этот код отлично работает, хотя и очень медленный. У меня есть пара сотен файлов .zip, которые я пытаюсь загрузить, чтобы их можно было обработать.

В структуре папок и подпапок данных по странам некоторые страны могут иметь 1 подпапку, а другие могут иметь несколько подпапок.

Чтобы имитировать существующие условия, я также прилагаю фиктивный код ниже:

library("furrr")
library("curl")

country.year.dir <- c("/test/GB/GB_2010", "/test/GB/GB_2014", "/test/GN/GN_2016",
"/test/GY/GY_2000", "/test/GY/GY_2006-2007", "/test/GY/GY_2014")

my.country.names_DTs$URL <- c("https://GB 2010 Datasets.zip", 
"https://GB 2014 Datasets.zip", "https://GN 2016 Datasets.zip", 
"https://GY 2006-2007 Datasets.zip", "https://GY 2014 Datasets.zip")

my.country.names_DTs$URL_Clean <- c("https://GB_2010_Datasets.zip", 
"https://GB_2014_Datasets.zip", "https://GN_2016_Datasets.zip", 
"https://GY_2006-2007_Datasets.zip", "https://GY_2014_Datasets.zip")

for(i in seq(country.year.dir)){
setwd(country.year.dir[i])
                    
my.shortcut.2 <- curl_download(my.country.names_DTs[i]$URL, destfile = 
my.country.names_DTs[i]$URL_Clean)
}

Я искал способы ускорить процесс загрузки ссылок и наткнулся на этот ответ: Как я могу настроить будущее для загрузки большего количества файлов?

Я изменил этот код, чтобы он соответствовал моей уникальной ситуации; однако приведенный ниже код не работает. Я получаю сообщение об ошибке.

download_template <- function(.x) {
for(i in seq(country.year.dir)) {
    my.shortcut.2 <- curl_download(url =
my.country.names_DTs[i]$URL, destfile = my.country.names_DTs[i]$URL_Clean)
}
}

download_future_core <- function() {
plan(multiprocess)
future_map(my.country.names_DTs$URL, download_template)
}

download_future_core()

Можно ли как-то ускорить работающий код, чтобы можно было сохранить ту же функциональность?

Спасибо.

ОБНОВЛЕНИЕ

Вместо того, чтобы пытаться использовать furrr, я переписал функцию, используя foreach. Пересмотренный код ниже:

library("foreach")
library("curl")
import::from(future, plan, cluster)
import::from(doParallel, registerDoParallel)
import::from(snow, stopCluster)
import::from(parallel, makeCluster, detectCores)

cl <- makeCluster(detectCores())

plan(strategy = "cluster", workers = cl)

registerDoParallel(cl)

download_MICS_files <- foreach(i = seq(country.year.dir_MICS)) %dopar% {

currDir <- getwd()
on.exit(setwd(currDir))
setwd(country.year.dir_MICS[i])

MICS_downloaded <- curl_download(my.country.names_MICS_DTs[i]$URL, destfile = 
my.country.names_MICS_DTs[i]$URL_Clean)

}

Поскольку я был (и все еще получаю) это сообщение об ошибке из цикла foreach:

Error in { : task 1 failed - "cannot change working directory"

Я искал помощь относительно циклов setwd и foreach. Я наткнулся на следующий ответ:

Как изменить рабочий каталог в асинхронных фьючерсах в R

и я использовал пару строк из этого ответа, но все равно получаю то же сообщение об ошибке.

Каков наилучший способ навигации между рабочими каталогами, чтобы конструкция foreach работала так же хорошо, как простой цикл for с сообщением об ошибке setwd()?

Спасибо.


person iembry    schedule 06.10.2020    source источник
comment
Проверьте это ?curl::multi   -  person ekoam    schedule 06.10.2020
comment
@ekoam Спасибо за ваше предложение, но я переписал функцию, используя foreach вместо furrr. Проблема заключается не в загрузке нескольких файлов одновременно, а в том, что нужные файлы находятся в правильных подпапках.   -  person iembry    schedule 06.10.2020