【发布时间】:2019-08-07 06:37:25
【问题描述】:
我几乎所有的 R 代码都写在工作包中(并使用 git)。我大量使用devtools,特别是load_all 的捷径等,因为我更新了包中使用的函数。我对devtools 有一个粗略的了解,因为load_all 制作了一个包的临时副本,我非常喜欢这个用于测试包中的功能更新的工作流程。
是否有一种简单的方法/工作流程可以根据软件包运行模拟,同时开发它,而不会“破坏”这些模拟?
我怀疑有一个我忽略的简单解决方案。
现在我要做的是:
获取包“mypackage”以准备运行模拟。复制包含项目的整个文件夹。使用新的包名称“mypackage2”在复制的文件夹中运行模拟)。运行包含
library(mypackage2)但不包含library(mypackage)的模拟脚本。这令人讨厌地意味着我需要将library(mypackage)调用更新为library(mypackage2)调用。如果我使用library(mypackage)运行模拟并避免使用library(mypackage2),那么我需要确保mypackage的当前构建版本是“旧”版本,它不反映下面2. 中的更新(但下面2.也需要重建包!)。处理这一切变得一团糟。当模拟在复制的文件夹中运行时,我可以通过使用
load_all或重建包来更新“mypackage”中的函数。我经常需要重建包(即在测试包的更新不是可行的解决方案时使用load_all而不重建包)因为我想测试功能使用doParallel和foreach等(在Windows 上)运行小型并行模拟,并且我修改和想要测试的任何函数都需要子进程中最新构建的“mypackage”,这些子进程会生成调用“mypackage”的新R 进程。我知道,当一个包在 R 中构建时,它会存储在..\R\R-3.6.1\library中,当未来的 R 会话调用library(mypackage)时,他们将使用该版本的包。
我最想做的是,在同一个原始文件夹中,使用 mypackage 版本运行模拟,然后在模拟停止/启动时更新包中的代码,对我的开发充满信心更改不会破坏运行特定版本包的模拟。
是否有一种简单的方法来执行上述操作,而无需重新复制文件夹(并制作诸如“mypackage2”之类的东西)?
谢谢
这里描述的问题有点类似于我面临的Specify package location in foreach
问题是,如果我使用“mypackage”运行需要几天时间的模拟,并多次调用foreach,并在测试更改时更新和重建“mypackage”,那么来自模拟的未来foreach 调用可能会选择升级软件包的新更新版本,这将是一场灾难。
【问题讨论】:
-
您链接到的其他问题中的解决方案对您不起作用?为什么?
-
@Alexis 如果我不尝试在运行模拟的同时开发包(如果中断可能需要数天才能运行),那么另一个问题的答案将起作用。如果我正在更改包代码并重建,而其他脚本正在运行模拟(调用
foreach并生成新的 R 进程,在库文件夹中加载最新版本的包),我认为存在任何风险模拟中的子 R 进程中断,因为它们反映了包中的更改。
标签: r parallel-processing devtools parallel-foreach