drake R 中多个子计划的最佳实践

Best practice for multiple subplans in drake R

您好,我是 drake R 包的新手,想听听有关使用子任务管理大型项目的最佳实践的一些意见。我的项目的简化结构分为两部分:1) 数据清理和 2) 建模。从某种意义上说,它们是级联的,我首先进行数据清理,然后在开始建模部分时很少返回。

我认为手册建议的方法是:

source("functions_1.R") # for plan_1
plan1 <- drake_plan(
    # many middle steps to create
    foo = some_function()
    foo_1 = fn_1(foo)
    foo_2 = fn_2(foo_1)
    for_analysis = data_cleaning_fn()
)
plan2 <- drake_plan(
    # I would like to use the target name foo_1 again, but not the same object as they were defined in plan1. 
    # What I want:
    # foo_1 = fn_new_1(for_analysis) # this is different from above defined
    # result = model_fn(for_1)

    # What I actually did
    foo_new_1 = fn_new_1(for_analysis) # I have to define a new name different from foo_1
    result = model_fn(foo_new_1)
)
fullplan <- bind_plans(plan1,plan2)
make(fullplan)

我在上述工作流程中遇到的一个问题是我为 plan1 定义了很多中间目标,但它们在 plan2 中没有用。

  1. 有没有一种方法可以让我在 plan2 中拥有一个“干净的名称空间”,这样我就可以摆脱无用的名称 foo_1foo_2 等?这样我就可以在 plan2 中重复使用这些名称。我只想保留在 plan_2 中的是 for_analysis.
  2. 有没有一种方法可以将 functions_1.R 中定义的函数仅用于 plan1 以及 functions_2.R 中定义的函数仅用于 plan2?我希望每次都使用较小的函数集。

非常感谢!

有趣的问题。 drake 不支持计划中的多个命名空间。所有目标名称必须是唯一的,所有函数名称也必须是唯一的,因此如果要重用名称,则需要将这些计划一起放在单独的项目中。

您可能 运行 遇到定义过多目标的情况。从广义上讲,目标应该 (1) 为您的项目产生有意义的输出,或者 (2) 消耗足够的运行时间以便跳过它们可以节省您的时间。我推荐阅读 https://books.ropensci.org/drake/plans.html#how-to-choose-good-targets。要将多个目标压缩为一个目标,我建议将函数组合在一起。示例:

foo_all <- function()
  # Each middle step is super quick, but all put together, they take up noticeable runtime.
  foo <- some_function()
  foo_1 <- fn_1(foo)
  foo_2 <- fn_2(foo_1)
  for_analysis = data_cleaning_fn()
)

plan1 <- drake_plan(
  for_analysis = foo_all()
)

此外,drake 的分支机制是自动生成名称或避免过于费力地考虑名称的便捷方式。也许看看 https://books.ropensci.org/drake/static.html and https://books.ropensci.org/drake/dynamic.html.