随着输入的增加,德雷克计划的工作流程
Workflow for drake plan with increasing input
我有一个 drake 计划,它使用带 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))
)
这将创建动态目标,因此新文件将创建新的动态目标,但不会重新计算旧目标。
您用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 package (v0.3.0)
于 2020-09-04 创建
有动态分支
文件的动态分支比较棘手,file_in()
仅适用于静态目标。即使那样,为每个文件创建一个动态 sub-target 也可能不是最佳选择,因为您有成千上万个文件。将文件批处理成组并给每个组一个 sub-target 可能会更好。但是,如果您仍想对每个文件进行动态分支,可以采用以下方法来确保每个文件都被正确地可重复地跟踪更改。
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 package (v0.3.0)
于 2020-09-17 创建
这在 targets
due to tarchetypes::tar_files()
中稍微容易一些。
我有一个 drake 计划,它使用带 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))
)
这将创建动态目标,因此新文件将创建新的动态目标,但不会重新计算旧目标。
您用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 package (v0.3.0)
于 2020-09-04 创建有动态分支
文件的动态分支比较棘手,file_in()
仅适用于静态目标。即使那样,为每个文件创建一个动态 sub-target 也可能不是最佳选择,因为您有成千上万个文件。将文件批处理成组并给每个组一个 sub-target 可能会更好。但是,如果您仍想对每个文件进行动态分支,可以采用以下方法来确保每个文件都被正确地可重复地跟踪更改。
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 package (v0.3.0)
于 2020-09-17 创建这在 targets
due to tarchetypes::tar_files()
中稍微容易一些。