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