对于我的项目,有时需要重组,或者只是更改我的项目数据目录的挂载点(例如 - 升级到 catalina 并且不再能够拥有非标准的子目录/
)。
我注意到,即使输入目录的内容没有改变,将路径前缀更改为公共组件也会使所有目标无效。
有没有办法避免这种情况?
对于我的项目,有时需要重组,或者只是更改我的项目数据目录的挂载点(例如 - 升级到 catalina 并且不再能够拥有非标准的子目录/
)。
我注意到,即使输入目录的内容没有改变,将路径前缀更改为公共组件也会使所有目标无效。
有没有办法避免这种情况?
我在这里的主要建议是使用相对路径而不是绝对路径。如果您曾经使用过该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()
它速度很快,你的数据很大,而且几乎不会改变。