Работа с zip-файлами в целевом рабочем процессе

Я пытаюсь настроить рабочий процесс, который включает загрузку zip-файла, извлечение его содержимого и применение функции к каждому из его файлов.

У меня есть несколько проблем:

  1. Как мне настроить воспроизводимую пустую файловую систему? А именно, я надеюсь, что смогу создать систему пустых каталогов, в которые впоследствии будут загружаться файлы. В идеале я бы хотел сделать что-нибудь вроде , но я знаю из документации, что пустые каталоги нельзя использовать с format = "file". Я знаю, что могу просто сделать в каждом случае, когда мне это нужно, но это кажется неуклюжим.

  2. В представлении ниже я хотел бы работать индивидуально с каждым файлом, используя . Как следует из ошибки, мне нужно указать шаблон для родительской цели, поскольку . Вы можете видеть, что если бы я определил шаблон для родительской цели, мне снова нужно было бы сделать это для ее родительской цели. Насколько мне известно, шаблон не может быть установлен для цели, у которой нет родителей (но раньше я много раз ошибался).

У меня такое чувство, что я ошибаюсь - спасибо за ваше время.

      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 с помощью а затем сделать 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))
)
Другие вопросы по тегам