मैं ~ 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

unreadable dependecy graph

मैंने .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 सेट कर सकता हूं, लेकिन मैं वास्तव में फ़ाइल नाम रखना चाहता हूं।

0
der_grund 21 जिंदा 2020, 14:25

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"

2020-01-21 को reprex पैकेज द्वारा बनाया गया (v0.3.0)

2
landau 21 जिंदा 2020, 13:43