首页 > 解决方案 > Drake 仅在某些情况下缺少来自静态分支的依赖项

问题描述

我有一个通用形式的计划,如下所示。我的实际计划更复杂,我无法在玩具示例中重现此错误。有没有人见过这样的问题,你对可能导致它的原因有什么想法吗?该计划采用一组模型结果,生成一些图表的摘要并为每个图表生成报告。

dplan <- drake_plan(
    models = target(
        read_models(model),
        map(model = c("a","b","c"))
    ),
    dep1 = target(
        summarise_models(models),
        map(models)
    ),
    dep2 = target(
        plot_models(models),
        map(models)
    ),
    report = target(
        write_report(dep1, dep2),
        map(dep1, dep2)
    )
)

目标 dep1_a-c 和 dep2_a-c 已生成,但 dep2 存在问题 dep2_a-c 出现在图中,但 report_a-c 未显示为取决于它们,因为它们分别位于 dep1_a-c 上。也就是说,生成了 dep1_a 并且 report_a 依赖于它,而生成了 dep2_a,尽管 dep2 在map报告目标中的调用中,但 report_a 并不“相信”它依赖于 dep2_a。

我在运行时遇到make的错误是以下形式的错误: $error$message: object 'dep2' not found $error$calls:base::eval(quote(...并且引用显示 dep2 没有在调用中评估 dep2_a 等,它只是裸 dep2 当然作为目标存在,只有 dep2_a-c '我很困惑为什么这会发生在一个目标而不是其他目标上:(

我的真实示例有几个依赖项,并且我的示例中的 dep2 等效项在输出中几乎相同,它们返回映射到同一列表上的相同类型的对象,但由于某种原因,它们的目标在制作报告目标时未正确评估

我试过clean(destroy = TRUE)从头开始运行和重新运行,但没有运气

标签: rdrake-r-package

解决方案


对于未来的项目,我建议逐步建立计划,以避免事情失控。如果一次将所有目标都写在计划中,很容易不知所措。用户应该:

  1. 写 1 或 2 个目标。
  2. 检查计划,例如vis_drake_graph()plot(plan)
  3. 运行make(plan)
  4. readd()使用和/或loadd()(探索性分析)检查输出。
  5. 重复。

有关此迭代过程的示例,请参阅https://wlandau.github.io/learndrake

您上面写的计划没有任何问题,因此很难推测您的实际计划可能有什么问题。但好消息是您应该能够在不运行make()的情况下进行故障排除。vis_drake_graph()如果某些依赖关系指定不正确,可以立即告诉您。这是您的示例计划的图表。

library(drake)
plan <- drake_plan(
  models = target(
    read_models(model),
    map(model = c("a", "b"))
  ),
  dep1 = target(
    summarise_models(models),
    map(models, .id = model)
  ),
  dep2 = target(
    plot_models(models),
    map(models, .id = model)
  ),
  report = target(
    write_report(dep1, dep2),
    map(dep1, dep2, .id = model)
  )
)
vis_drake_graph(plan)

在此处输入图像描述

如果dep2没有正确展开,这就是图表的样子:

library(drake)
plan <- drake_plan(
  models = target(
    read_models(model),
    map(model = c("a", "b"))
  ),
  dep1 = target(
    summarise_models(models),
    map(models, .id = model)
  ),
  dep2 = target(
    plot_models(models),
    map(models, .id = model)
  ),
  report = target(
    write_report(dep1, dep2),
    map(dep1, dep2, .id = model)
  )
)
vis_drake_graph(plan)

在此处输入图像描述


推荐阅读