【问题标题】:How can I automatically load and attach imported functions on project open in package dev?如何在包 dev 中打开的项目中自动加载和附加导入的函数?
【发布时间】:2019-01-13 17:10:18
【问题描述】:

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

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

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

即使我的NAMESPACE 中有胶水。

不是什么大不了的事,有点剃掉了几秒钟和相当多的挫败感。

请注意,这仅适用于 package 开发的上下文。 在非包项目中,我可以将library() 放入我的.Rprofile,但对于包 已经在NAMESPACE 中声明的包,这将是多余的。 p>

【问题讨论】:

  • 既然您提到了devtools(在您的回答中),您是否使用devtools::load_all() 进行包的交互式开发?
  • 是的,但devtools::load_all() 似乎并没有单独加载在NAMESPACE 中声明为导入的包。
  • 嗯,对不起,我以为是……
  • 是因为devtools::load_all 读取的是DESCRIPTION 而不是NAMESPACE?

标签: r rstudio devtools


【解决方案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 子句中以仅在本地开发机器上调用它似乎是明智的。

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

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

【讨论】:

  • 我同意特定项目的.Rprofile 是正确的方式。
猜你喜欢
  • 2012-12-23
  • 1970-01-01
  • 2012-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多