0

我有一个德雷克计划,它使用带有file_in. 然后读取文件夹中的每个文件并进行一些转换。最后,它加入结果。

如果我添加一个新文件,我希望计划中的新计算只应用于这个文件,然后加入到以前的结果中。然而,该计划所做的是:它检测到目标的变化,然后根据该目标重新计算所有目标。

注意:文件数量很大(几千个),计算量很大。

解决方案(查看landau的解决方案以获得更好的解决方案)

此解决方案完成了我标记为解决方案的答案:

您使用 file_in() 或 target(format = "file") 声明的任何文件或目录都被视为不可约的数据单元,并且在 drake 中的这种行为在未来的开发中不会改变。但是您可以在多个目标之间拆分文件,以便在文件更改时某些目标保持最新。

library(drake)

drake_plan(
  input  = target(list.files(file_in("/path/to/folder")),format="file"),
  target1 = target(do_stuff1(input), dynamic=map(input)) 
)

这将创建动态目标,因此新文件将创建新的动态目标,但不会重新计算旧目标。

4

1 回答 1

1

您声明的任何文件或目录file_in()或被target(format = "file")视为不可约的数据单元,并且这种行为drake在未来的开发中不会改变。但是您可以在多个目标之间拆分文件,以便在文件更改时某些目标保持最新。

library(drake)
group1 <- c("file1", "file2")
group2 <- c("file3", "file4")
drake_plan(
  target1 = do_stuff(file_in(!!group1)),
  target2 = do_stuff(file_in(!!group2))
)
#> # A tibble: 2 x 2
#>   target  command                               
#>   <chr>   <expr_lst>                            
#> 1 target1 do_stuff(file_in(c("file1", "file2")))
#> 2 target2 do_stuff(file_in(c("file3", "file4")))

reprex 包(v0.3.0)于 2020 年 9 月 4 日创建

动态分支

文件上的动态分支比较棘手,file_in()仅适用于静态目标。即使这样,为每个文件创建一个动态子目标也可能不是最理想的,因为您有成千上万个文件。最好将文件批处理成组并将每个组分配给一个子目标。但是,如果您仍然想动态地对每个文件进行分支,那么可以使用以下方法来确保每个文件都被正确地重复跟踪以进行更改。

library(drake)
drake_plan(
  # Always run to get the latest set of file paths.
  untracked_files = target(
    list.files("directory_with_files", full.names = TRUE),
    trigger = trigger(condition = TRUE)
  ),
  # Map over the vector of file paths and reproducibly track each one.
  tracked_files = target(
    untracked_files,
    dynamic = map(untracked_files)
  ),
  # Map over the tracked files and analyze each one.
  analyses = target(
    do_stuff(tracked_files),
    dynamic = map(tracked_files)
  )
)
#> # A tibble: 3 x 4
#>   target       command                          trigger           dynamic       
#>   <chr>        <expr_lst>                       <expr_lst>        <expr_lst>    
#> 1 untracked_f… list.files("directory_with_file… trigger(conditio… NA           …
#> 2 tracked_fil… untracked_files                … NA              … map(untracked…
#> 3 analyses     do_stuff(tracked_files)        … NA              … map(tracked_f…

reprex 包(v0.3.0)于 2020-09-17 创建

targets由于tarchetypes::tar_files(). _

于 2020-09-04T13:12:59.793 回答