对于我的项目,有时需要重组或简单地更改我的项目数据目录的挂载点(例如-升级到catalina,并且不再具有/
的非标准子目录)。
我注意到,即使输入目录的内容不变,将路径前缀更改为通用组件也会使所有目标无效。
有办法避免这种情况吗?
答案 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()
很快,您的数据很大,几乎没有改变。