有没有办法在不使下游目标无效的情况下更改 file_in 输入到 drake 的绝对路径?

Is there a way to change the absolute path of file_in inputs to drake without invalidating downstream targets?

对于我的项目,有时需要重组或简单地更改我的项目数据目录的安装点(例如 - 升级到 catalina 并且不再能够拥有 / 的非标准子目录)。

我注意到,即使输入目录的内容没有改变,更改公共组件的路径前缀也会使所有目标失效。

有没有办法避免这种情况?

我在这里的主要建议是使用相对路径而不是绝对路径。如果你曾经使用过 here 包,也是一样的想法。但我建议在计划中不要写 file.path(here::here(), "path/to/file.txt"),而是写 file_in("path/to/file.txt"),假设您打算在工作目录为 path.

时调用 drake::make()

供以后参考。在你现在的情况下,如果你绝对确定所有文件都是最新的并且你不想花时间重建目标,那么你可以使用 make(plan, trigger = trigger(command = FALSE, file = FALSE) 告诉 drake 停止担心关于命令或文件是否更改。 (为什么是命令?因为那是 file_in() 调用的地方,我假设你正在改变里面的路径。)

编辑

我现在意识到我第一次没有完全理解你的问题。但由于我也以与您类似的方式处理数据,所以我认为有一个答案。假设您有这样的计划:

plan <- drake_plan(
  data = get_data(file_in("DRIVE_NAME/file.db"))
)

并且您的挂载点发生变化,使其看起来像这样:

plan <- drake_plan(
  data = get_data(file_in("DIFFERENT_MOUNT_POINT/file.db"))
)

正如您所指出的,斗争来自于那条不断变化的道路。您可以在此处使用 "change" trigger 手动跟踪文件。这样,我们就不需要 file_in()。其次,在变化的路径周围使用 ignore(),这样 drake 认为命令保持不变。更改挂载点时没有多余的失效。

plan <- drake_plan(
  data = target(
    get_data(ignore("WHATEVER_MOUNT_POINT/file.db")),
    trigger = trigger(change = file.mtime("WHATEVER_MOUNT_POINT/file.db"))
  ) 
)

现在,只要修改时间改变,数据就会失效。但是您可以更改 WHATEVER_MOUNT_POINT 而不会导致失效。我通常会为触发器选择一个文件哈希(这就是 file_in() 告诉 drake 作为最后结果做的事情)但我为你选择了时间戳,因为 file.mtime() 很快,你的数据很大,而且几乎没有变化。