有没有办法在不使下游目标无效的情况下更改 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()
很快,你的数据很大,而且几乎没有变化。
对于我的项目,有时需要重组或简单地更改我的项目数据目录的安装点(例如 - 升级到 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()
很快,你的数据很大,而且几乎没有变化。