Работа с zip-файлами в целевом рабочем процессе
Я пытаюсь настроить рабочий процесс, который включает загрузку zip-файла, извлечение его содержимого и применение функции к каждому из его файлов.
У меня есть несколько проблем:
Как мне настроить воспроизводимую пустую файловую систему? А именно, я надеюсь, что смогу создать систему пустых каталогов, в которые впоследствии будут загружаться файлы. В идеале я бы хотел сделать что-нибудь вроде
, но я знаю из документации, что пустые каталоги нельзя использовать с format = "file". Я знаю, что могу просто сделать в каждом случае, когда мне это нужно, но это кажется неуклюжим. В представлении ниже я хотел бы работать индивидуально с каждым файлом, используя
. Как следует из ошибки, мне нужно указать шаблон для родительской цели, поскольку . Вы можете видеть, что если бы я определил шаблон для родительской цели, мне снова нужно было бы сделать это для ее родительской цели. Насколько мне известно, шаблон не может быть установлен для цели, у которой нет родителей (но раньше я много раз ошибался).
У меня такое чувство, что я ошибаюсь - спасибо за ваше время.
library(targets)
tar_script({
tar_option_set(packages = c("tidyverse", "fs"))
download_file <- function(url, dest) {
download.file(url, dest)
dest
}
do_stuff <- function(file_path) {
fs::file_copy(file_path, file_path, overwrite = TRUE)
}
list(
tar_target(downloaded_zip,
download_file("https://file-examples-com.github.io/uploads/2017/02/zip_2MB.zip",
path(dir_create("data"), "file", ext = "zip")),
format = "file"),
tar_target(extracted_files,
unzip(downloaded_zip, exdir = dir_create("data")),
format = "file"),
tar_target(stuff_done,
do_stuff(extracted_files),
pattern = map(extracted_files), format = "file",
iteration = "list"))
})
tar_make()
#> * start target downloaded_zip
#> trying URL 'https://file-examples-com.github.io/uploads/2017/02/zip_2MB.zip'
#> Content type 'application/zip' length 2036861 bytes (1.9 MB)
#> ==================================================
#> downloaded 1.9 MB
#>
#> * built target downloaded_zip
#> * start target extracted_files
#> * built target extracted_files
#> * end pipeline
#> Error : Target stuff_done tried to branch over extracted_files, which is illegal. Patterns must only branch over explicitly declared targets in the pipeline. Stems and patterns are fine, but you cannot branch over branches or global objects. Also, if you branch over a target with format = "file", then that target must also be a pattern.
#> Error: callr subprocess failed: Target stuff_done tried to branch over extracted_files, which is illegal. Patterns must only branch over explicitly declared targets in the pipeline. Stems and patterns are fine, but you cannot branch over branches or global objects. Also, if you branch over a target with format = "file", then that target must also be a pattern.
#> Visit https://books.ropensci.org/targets/debugging.html for debugging advice.
Создано 2021-12-08 пакетом REPEX (v2.0.1)
1 ответ
Оригинальный ответ
Вот идея: вы можете отслеживать этот URL с помощью
Редактировать
Если подумать, нам, вероятно, нужно хэшировать все локальные файлы оптом. Не самый эффективный, но со своей задачей справляется.
# _targets.R file
library(targets)
tar_option_set(packages = c("tidyverse", "fs"))
download_file <- function(url, dest) {
download.file(url, dest)
dest
}
do_stuff <- function(file_path) {
file.info(file_path)
}
download_and_unzip <- function(url) {
downloaded_zip <- tempfile()
download_file(url, downloaded_zip)
unzip(downloaded_zip, exdir = dir_create("data"))
}
list(
tar_target(
url,
"https://file-examples-com.github.io/uploads/2017/02/zip_2MB.zip",
format = "url"
),
tar_target(
files_bulk,
download_and_unzip(url),
format = "file"
),
tar_target(file_names, files_bulk), # not a format = "file" target
tar_target(
files, {
files-bulk # Re-hash all the files separately if any file changes.
file_names
},
pattern = map(file_names),
format = "file"
),
tar_target(stuff_done, do_stuff(files), pattern = map(files))
)