1

嗨,我是drakeR 包的新手,想听听一些关于使用子任务管理大型项目的最佳实践的意见。我的项目的简化结构有两个部分: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_2for_analysis.
  2. 有没有办法可以使用functions_1.R仅在 for 中定义的函数和仅在 for中plan1定义的函数?我想每次都使用一组较小的函数。functions_2.Rplan2

十分感谢!

4

1 回答 1

0

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

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

foo_all <- 函数()
  # 每个中间步骤都非常快,但是放在一起,它们会占用明显的运行时间。
  foo <- some_function()
  foo_1 <- fn_1(foo)
  foo_2 <- fn_2(foo_1)
  for_analysis = data_cleaning_fn()
)

计划1 <-德雷克计划(
  for_analysis = foo_all()
)

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

于 2020-06-23T03:31:41.127 回答