如何在包 dev 中打开的项目上自动加载和附加导入的函数?

How can I automatically load and attach imported functions on project open in package dev?

当我在计算机上打开 R package 项目时,我想自动加载并附加 library() 中列出的所有包给定包的相应 NAMESPACE 作为 import()s(不是 importFrom()s)。

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

glue("foo")
# Error in glue("foo") : could not find function "glue"

尽管我在我的NAMESPACE里有胶水。

没什么大不了的,稍微减少了几秒钟,也有点沮丧。

请注意,这仅适用于 package 开发环境。 在非包项目中,我可以将 library() 放入我的 .Rprofile,但对于包来说,这将是多余的,其中所述包 已经声明在 NAMESPACE.

我的方法是将以下内容添加到我的项目(和包)根目录中的 .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 子句中以仅在本地开发机器上调用它似乎是明智的。

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

如果有人有更好的想法,请告诉我。