Как мне читать файлы Dynami c в Drake? - PullRequest
0 голосов
/ 07 августа 2020

Я хочу использовать цели drake Dynami c для чтения нескольких файлов. Я написал следующий план, основываясь на моем понимании того, как работают файлы Dynami c. Однако при изменении входного файла drake не обновляет правильно все цели.

Как правильно использовать файлы drake Dynami c для чтения файлов?

Другими словами, что - это версия файла file_in() в формате Dynami c для решения этой проблемы: Как я могу импортировать из нескольких файлов в r-drake?

library(drake)
library(tidyverse)

content <- tibble(x1 = 1, x2 = 1)
walk(list("a", "b"), ~ write_csv(x = content, path = paste0(., ".csv")))
read_csv("b.csv", col_types = "dd")
#> # A tibble: 1 x 2
#>      x1    x2
#>   <dbl> <dbl>
#> 1     1     1

plan <- drake::drake_plan(
  import_paths = target(c(
    a = "a.csv",
    b = "b.csv"
  ),
  format = "file"
  ),

  data = target(
    read_csv(import_paths, col_types = "dd"),
    dynamic = map(import_paths)
  )
)

drake::make(plan)
#> ▶ target import_paths
#> ▶ dynamic data
#> > subtarget data_44119303
#> > subtarget data_ecc6ebe6
#> ■ finalize data
readd(data)
#> # A tibble: 2 x 2
#>      x1    x2
#>   <dbl> <dbl>
#> 1     1     1
#> 2     1     1

walk(list("b"), ~ write_csv(x = content + 1, path = paste0(., ".csv")))
read_csv("b.csv", col_types = "dd")
#> # A tibble: 1 x 2
#>      x1    x2
#>   <dbl> <dbl>
#> 1     2     2

drake::make(plan)
#> ▶ target import_paths
#> ■ finalize data
readd(data)
#> # A tibble: 2 x 2
#>      x1    x2
#>   <dbl> <dbl>
#> 1     1     1
#> 2     1     1

Создано в 2020 г. -08-06 с помощью пакета REPEX (v0.3.0)

1 Ответ

1 голос
/ 07 августа 2020

Возможно, это не очевидно, но файловые цели динамического c неуменьшаемы. Если c("a.csv", "b.csv") - ваш динамический c файл, вы не можете разбить его на "a.csv" и " b.csv". drake хранит глобальный ha sh всех этих файлов вместе и не отслеживает хеши или временные метки для каждого файла отдельно. Это помогает drake оставаться эффективным, даже если вы возвращаете большое количество динамических c файлов из одной цели.

Решение состоит в том, чтобы сделать "a.csv" и "b.csv" двумя разными динамическими c файлами цели с использованием динамического c map(). Вам нужна дополнительная цель в начале, чтобы содержать имена путей, но она выполняет свою работу.

library(drake)
library(tidyverse)

content <- tibble(x1 = 1, x2 = 1)
walk(list("a", "b"), ~ write_csv(x = content, path = paste0(., ".csv")))
read_csv("b.csv", col_types = "dd")
#> # A tibble: 1 x 2
#>      x1    x2
#>   <dbl> <dbl>
#> 1     1     1

plan <- drake_plan(
  import_paths = c("a.csv", "b.csv"),
  import_files = target(
    import_paths,
    format = "file",
    dynamic = map(import_paths)
  ),
  data = target(
    read_csv(import_files, col_types = "dd"),
    dynamic = map(import_files)
  )
)

make(plan)
#> ▶ target import_paths
#> ▶ dynamic import_files
#> > subtarget import_files_4209ea92
#> > subtarget import_files_b8419eb2
#> ■ finalize import_files
#> ▶ dynamic data
#> > subtarget data_b59aea49
#> > subtarget data_e6b8ef3e
#> ■ finalize data

readd(data)
#> # A tibble: 2 x 2
#>      x1    x2
#>   <dbl> <dbl>
#> 1     1     1
#> 2     1     1

walk(list("b"), ~ write_csv(x = content + 1, path = paste0(., ".csv")))
read_csv("b.csv", col_types = "dd")
#> # A tibble: 1 x 2
#>      x1    x2
#>   <dbl> <dbl>
#> 1     2     2

make(plan)
#> ▶ dynamic import_files
#> > subtarget import_files_b8419eb2
#> ■ finalize import_files
#> ▶ dynamic data
#> > subtarget data_a0f1c4f0
#> ■ finalize data

readd(data)
#> # A tibble: 2 x 2
#>      x1    x2
#>   <dbl> <dbl>
#> 1     1     1
#> 2     2     2

Создано 06.08.2020 с помощью пакета репекс (v0.3.0)

...