如何在程序包dev中打开的项目上自动加载和附加导入的功能?

时间:2018-08-06 17:22:48

标签: r rstudio devtools

当我在计算机上打开一个R package 项目时,我想自动加载并附加library()相应{{1}中列出的所有软件包给定包中的}个NAMESPACE(而不是import()个)

这很有用,因为它使我可以更快地交互式评估代码。否则,我会浪费时间来处理,例如,

importFrom()

即使我在自己的glue("foo") # Error in glue("foo") : could not find function "glue" 中粘了。

没什么大不了的,要刮掉几秒钟和相当多的挫败感。

请注意,这仅适用于 package 开发的环境。 在非软件包项目中,我可以只将NAMESPACE放入我的library()中,但是对于软件包来说,这是多余的,其中所说的软件包 已经在{{ 1}}。

1 个答案:

答案 0 :(得分:1)

我的方法是在项目(和程序包)根目录的.Rprofile中添加以下内容:

if (Sys.getenv()["LOGNAME"] %in% c("foo_user", "bar_user")) {
  message("I seem to be running on a dev machine, so I am doing some preparatory steps.")
  imports <- devtools::parse_ns_file()$imports  # capture all imports from namespace file
  imports <- purrr::discard(.x = imports, .p = is.list)  # only take the import(), not the importFrom() declarations.
  purrr::walk(.x = imports, .f = library, character.only = TRUE)
}

这看起来像是个好方法吗?


更新(已包含在上面)

似乎某些CI系统(Appveyor)不喜欢devtools::...)和.Rprofile中的其他调用,可能是因为它们在构建的任何阶段都没有可用的此软件包和其他软件包周期.Rprofile被称为(相当早?)。 因此,将整个shebang包裹在if子句中以仅在本地dev机器上调用它似乎是明智的。

在macOS上,Sys.getenv()["LOGNAME"]给出了简短的用户名,所以我用它来标识我的开发机器。

让我知道是否有人有更好的主意。