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

时间:2019-12-12 04:09:30

标签: r drake-r-package

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

我注意到,即使输入目录的内容不变,将路径前缀更改为通用组件也会使所有目标无效。

有办法避免这种情况吗?

1 个答案:

答案 0 :(得分:1)

我在这里的主要建议是使用相对路径而不是绝对路径。如果您曾经使用过here软件包,那是相同的想法。但是,如果您打算在工作目录为file.path(here::here(), "path/to/file.txt")时调用file_in("path/to/file.txt"),则建议在计划中编写drake::make(),而不是写path

以供将来参考。就目前的当前情况而言,如果您完全确定所有文件都是最新的,并且不想花费时间重建目标,则可以使用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()很快,您的数据很大,几乎没有改变。