【发布时间】:2017-10-13 07:25:37
【问题描述】:
使用包时,RStudio 中的 Load All 命令和 Build & Reload 命令有什么区别?
我现在的主要工作流程是合并我正在构建的包的当前更改,以便我可以在不同的 RStudio 会话中实际使用我机器上的最新功能。
【问题讨论】:
使用包时,RStudio 中的 Load All 命令和 Build & Reload 命令有什么区别?
我现在的主要工作流程是合并我正在构建的包的当前更改,以便我可以在不同的 RStudio 会话中实际使用我机器上的最新功能。
【问题讨论】:
我一直在探索这种工作流程,并将使用您的问题来记录我的发现。
案例 1:同一会话中的 Pkg 和代码
在 RStudio 中选择 File / New Project ... New Directory / R Package。将定义函数库的脚本放在 R 目录中。将任何开放代码放在其他地方(例如,在名为“scripts”的子目录中)。使用dev_tools::load_all (Ctrl-Shift-L) 将 R 目录中定义的任何对象加载到当前会话中。这适用于简单对象并避免较慢的构建和重新加载周期。
如果您喜欢在这种模式下工作,请认识到任何构建操作都会复制许多这些文件。对于代码,这很好,但如果您在子目录中有大型数据文件,则构建速度可能会很慢,并且会消耗大量存储空间。考虑将它们放在构建时被忽略的目录中,或者如果更合适的话,将它们放在项目之外。
在 RStudio 中构建的一个很好的副作用是您可以为所有对象构建文档。通过运行roxygen2::roxygenise(),我们仍然可以在不安装软件包的情况下执行此操作。
案例 2:单独会话中的 Pkg 和代码
当您拥有可能被不同项目使用的功能但您需要返回并编辑其中一个包时,就会发生这种情况。
在第一个会话中,假设我们加载了一个名为“greetings”的包。如上所述使用 RStudio 执行此操作,它将定义一个“hello world”函数:hello()。运行 Build & Reload 在本地包库中安装这个包。打开第二个会话以确认您可以调用此函数:
greetings::hello()
#> "Hello, world!"
在第一个会话中,修改greetings::hello() 来代替。 Build & Reload (Ctrl+Shift+B) 将更改安装到包库中。第二个会话不会接受更改:
greetings::hello()
#> "Hello, world!"
devtools:reload() 没有帮助,因为如果未附加包,它会静默退出:
reload(inst("greetings"))
greetings::hello()
#> "Hello, world!"
但是,我发现这个组合会在第二个会话中获得变化:
unload(inst("greetings"))
reload(inst("greetings"))
greetings::hello()
#> "Goodbye, cruel world!"
所以案例 2 的开发存在一些局限性。
【讨论】: