0

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

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

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

4

1 回答 1

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)telldrake停止担心命令或文件是否更改。(为什么是命令?因为那是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"))
)

正如你所指出的,斗争来自那条不断变化的道路。您可以在此处使用“更改”触发器手动跟踪文件。这样,我们就不需要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()它速度很快,你的数据很大,而且几乎不会改变。

于 2019-12-12T13:39:33.493 回答