статическое ветвление drake: как использовать .id в map () для увеличения видимости графа зависимостей

Я использую рабочий процесс Drake для обработки ~ 100 файлов, которые хранятся в месте с очень длинными именами файлов. Эти длинные имена файлов затрудняют чтение графа зависимостей. Вот минимальный пример:

# example setup
library(drake)
very_long_path <- "this_is_a_very_long_file_path_which_makes_the_dependency_graph_hard_to_read"
dir.create(very_long_path)
filenames <- paste0("file_", seq(4), ".csv")
for (file in filenames) {
    file.create(file.path(very_long_path, file))
}
files <- list.files(very_long_path, full.names = TRUE)
ids <- rlang::syms(filenames)

# my drake plan
plan <- drake_plan(
    raw = target(
        read.csv(file_in(!!file)),
        transform = map(file = !!files)
    )
)
plan

## A tibble: 4 x 2
#  target                                           command                                              
#  <chr>                                            <expr>                                               
#1 raw_this_is_a_very_long_file_path_which_makes_t~ readLines(file_in("this_is_a_very_long_file_path_whic~
#2 raw_this_is_a_very_long_file_path_which_makes_t~ readLines(file_in("this_is_a_very_long_file_path_whic~
#3 raw_this_is_a_very_long_file_path_which_makes_t~ readLines(file_in("this_is_a_very_long_file_path_whic~
#4 raw_this_is_a_very_long_file_path_which_makes_t~ readLines(file_in("this_is_a_very_long_file_path_whic~

vis_drake_graph(drake_config(plan)) ## very hard to read

нечитаемый график зависимости

Я читал о .id в ?transformations следующее:

Символ или вектор символов, обозначающих группирующие переменные, которые необходимо включить в целевые имена. Полезно для создания коротких имен целей. Установите .id = FALSE, чтобы использовать целочисленные индексы в качестве суффиксов имени цели.

Вот почему я создал ids в приведенном выше коде, чтобы предоставить короткие имена для целей. Но вот изменение плана не помогло:

plan <- drake_plan(
    raw = target(
        readLines(file_in(!!file)),
        transform = map(file = !!files,
                        .id = !!ids)
    )
)
plan

## A tibble: 4 x 2
#  target                                           command                                              
#  <chr>                                            <expr>                                               
#1 raw_this_is_a_very_long_file_path_which_makes_t~ readLines(file_in("this_is_a_very_long_file_path_whic~
#2 raw_this_is_a_very_long_file_path_which_makes_t~ readLines(file_in("this_is_a_very_long_file_path_whic~
#3 raw_this_is_a_very_long_file_path_which_makes_t~ readLines(file_in("this_is_a_very_long_file_path_whic~
#4 raw_this_is_a_very_long_file_path_which_makes_t~ readLines(file_in("this_is_a_very_long_file_path_whic~

Насколько я понимаю, ids - это вектор символов, поэтому я не понимаю, почему это не работает. Что мне не хватает? Это вообще возможно?


Я также попытался вставить ids как вектор символов, но безуспешно. Я знаю, что могу установить .id = FALSE, чтобы просто перечислять элементы raw, но я действительно хочу сохранить имена файлов.


person der_grund    schedule 21.01.2020    source источник


Ответы (1)


Вы очень близки. Все, что вам нужно сделать, это зарегистрировать ids как группирующую переменную, а затем передать символ группирующей переменной в .id.

library(drake)
very_long_path <- "this_is_a_very_long_file_path_which_makes_the_dependency_graph_hard_to_read"
dir.create(very_long_path)

filenames <- paste0("file_", seq(4), ".csv")

for (file in filenames) {
  file.create(file.path(very_long_path, file))
}

files <- list.files(very_long_path, full.names = TRUE)
ids <- rlang::syms(filenames)

plan <- drake_plan(
  raw = target(
    read.csv(file_in(!!file)),
    transform = map(
      file = !!files,
      id_var = !!ids, # Register the grouping variable.
      .id = id_var    # Use the existing grouping variable.
    )
  )
)

plan
#> # A tibble: 4 x 2
#>   target        command                                                         
#>   <chr>         <expr>                                                          
#> 1 raw_file_1.c… read.csv(file_in("this_is_a_very_long_file_path_which_makes_the…
#> 2 raw_file_2.c… read.csv(file_in("this_is_a_very_long_file_path_which_makes_the…
#> 3 raw_file_3.c… read.csv(file_in("this_is_a_very_long_file_path_which_makes_the…
#> 4 raw_file_4.c… read.csv(file_in("this_is_a_very_long_file_path_which_makes_the…

plan$target
#> [1] "raw_file_1.csv" "raw_file_2.csv" "raw_file_3.csv" "raw_file_4.csv"

Создано 21 января 2020 г. пакетом REPEX (v0.3.0)

person landau    schedule 21.01.2020
comment
После этого я заметил странное поведение: эти цели всегда остаются устаревшими (после успешного make()). Я отследил это до символов, начинающихся с цифр (в приведенном выше случае ids было похоже на 20190131). Это ошибка или что-то, чего я (пока) не понимаю в символах? - person der_grund; 23.01.2020
comment
Странный. Различаются ли идентификаторы в плане каждый раз, когда вы создаете вектор ids и вызываете drake_plan()? В любом случае, если проблема не исчезнет, ​​вы можете создать еще один reprex и опубликовать проблема. - person landau; 23.01.2020