2

我想在另一个 git-versioned R 项目中使用在一个 git-versioned R 项目中生成的 R 对象(例如,清理的数据)。

具体来说,我有多个 git 版本的 R 项目(包含drake计划),它们为我的论文实验做各种事情(例如,生成材料、导入和清理数据、生成报告/文章)。

理想情况下,特定于实验的项目应该是:

  1. 可连接 - 这样我就可以将我在这些项目中生成的对象(主要是数据和材料)放入另一个生成我的论文报告的 git 版本化 R 项目中。
  2. 自包含 - 以便我可以在其他非论文项目(例如演示文稿、报告和期刊手稿)中使用它们。在共享此类项目时,我最好不要共享单一的论文项目。
  3. 版本化 - 以便它们在不同项目中的使用可以独立(例如,如果我在提交论文后对手稿的数据清理进行了更改,我仍然希望论文能够像最初编译的那样重现)。

目前我可以看到三种方法:

  1. 重新创建数据清洗流程
    • 但是:这涉及到复制/粘贴,我想避免这种情况,尤其是在上游发生变化的情况下。
  2. 通过更改工作目录访问相关脚本/功能
    • 但是:即使我使用here它,这似乎也会导致重现性差。
  3. 将源项目制作成包,并将我想要“导出”的对象制作成导出的数据(根据Hadley 的 R 包指南的数据部分

有没有其他方法可以做到这一点?

编辑:我尝试了@landau 提出的使用单一drake计划的建议,这在一段时间内效果很好,直到(类似于@vrognas 的案例)我最终得到了太多依赖于相同的对象。因此,我在上面对这个问题的意图进行了一些澄清。

4

3 回答 3

2

我的第一个建议是使用单一drake计划来统一需要共享数据的整个项目的各个阶段。旨在以这种方式处理大量移动部件,并且在决定下游重新运行的内容drake时会更加无缝。drake但是,如果您确实需要在共享数据的不同子项目中使用不同的计划,您可以在一个计划中将每个共享数据集作为一个file_out()文件进行跟踪,并file_in()在另一个计划中进行跟踪。

upstream_plan <- drake_plan(
  export_file = write_csv(dataset, file_out("exported_data/dataset.csv"))
)
downstream_plan <- drake_plan(
  dataset = read_csv(file_in("../upstream_project/exported_data/dataset.csv"))
)
于 2020-08-20T13:56:45.373 回答
1

你从根本上误解了迈尔斯麦克贝恩的批评。他并不是说你不应该编写可重用的代码,也不是说你不应该使用包。他是说你不应该对所有东西都使用包。但是可重用代码(即您想要重用的代码)绝对属于包(或者,更好的是,模块),然后可以在多个项目中使用。

话虽如此,首先,请注意 Will Landau 的建议。

其次,您可以使您的 RStudio 项目可配置,以便它们可以根据配置中给出的路径加载数据。一旦完成,没有什么可以反对该配置文件中不同项目中数据的硬编码路径。

于 2020-08-20T14:10:34.370 回答
1

我也有类似的情况。我有许多项目是从一个原始数据集产生的。以前,当项目还年轻且规模较小时,我将所有这些都放在一个版本控制的项目中。随着更多子项目的产生,并且我的 git 历史因并行处理项目而变得混乱,这变得一发不可收拾。这可能是因为我缺乏 git 技能。我的文件夹结构如下所示:

project/.git  
project/main/  
project/sub-project_1/  
project/sub-project_2/  
project/sub-project_n/

我打算将每个项目都放在自己的 git 分支中,但后来我无法同时访问它们。如果我必须更改主数据集的某些内容(例如,我可能没有清理某些部分),那么项目 1 可能会变得过时且无法正常工作。一旦我完成了项目 1,我希望它被隔离并包含在可重复性上。如果项目是分开的,这更容易实现。我不认为drake/targets计划会解决这个问题?

我还简要地研究了将项目作为 git 子模块,但它似乎增加了太多的复杂性。同样,我对 git 的无知可能会在这里闪耀。

我目前的解决方案是将主要数据作为一个 R 包,将每个子项目作为一个单独的 git-versioned 文件夹(它们实际上也是包,但这不是必需的)。这样我可以加载特定版本的数据(renv用于包版本)。

我的文件夹结构现在看起来像这样:

main/.git  
sub-project_1/.git  
sub-project_2/.git  
sub-project_n/.git

在每个子项目中,我调用library(main)加载清理后的数据。在每个子项目中,可以使用drake/计划。targets

于 2021-05-11T06:21:54.523 回答