r-如何使用renv显式管理依赖关系



我更喜欢有一个配置文件,并在其中列出项目所需的包,而不是依靠renv::init()来抓取项目并找到我需要的所有包(它通常无法(。

所以我的问题是——我如何明确地告诉renv项目需要哪些包,举个例子会很好。

renv包可以做各种各样的事情:从几个不同的位置安装,设置一个特定于项目的库,这样你就可以控制项目的版本,等等。如果你需要这些东西,我认为你运气不好。据我所见,它无法传递依赖项列表,它需要扫描您的源代码来找到它们。我想你可以包含一个类似的功能

loadPackages <- function() {
requireNamespace("foo")
requireNamespace("bar")
...
}

使renv更容易找到所需的包,但如果它以其他方式失败(例如,您有不完整的文件,无法正确解析(,这将无济于事。

如果你不需要那些花哨的东西,你可以使用下面的功能:

needsPackages <- function(pkgs, install = TRUE, update = FALSE, 
load = FALSE, attach = FALSE) {
missing <- c()
for (p in pkgs) {
if (!nchar(system.file(package = p)))
missing <- c(missing, p)
}
if (length(missing)) {
missing <- unique(missing)
if (any(install)) {
toinstall <- intersect(missing, pkgs[install])
install.packages(toinstall)
for (p in missing)
if (!nchar(system.file(package = p)))
stop("Did not install: ", p)
} else
stop("Missing packages: ", paste(missing, collapse = ", "))
}
if (any(update))
update.packages(oldPkgs = pkgs[update], ask = FALSE, checkBuilt = TRUE)
for (p in pkgs[load])
loadNamespace(p)
for (p in pkgs[attach])
library(p, character.only = TRUE)
}

这是我在一个项目中使用的。你称之为

needsPackages(c("foo", "bar"))

并安装缺失的。它还可以更新、加载或附加它们。它只是使用标准函数CCD_ 4从CRAN安装,没有花哨的安装位置选择,或维护特定的软件包版本。如果您确实使用了像这样简单的东西,您应该在之后运行sessionInfo()来记录包版本号,以防以后需要返回到相同的状态。(尽管回到那种状态可能会很痛苦!(

这里有两种可能的前进方式:

  1. 配置renv以使用";明确的";快照,如中所述https://rstudio.github.io/renv/reference/snapshot.html#snapshot-type——此工作流要求您在DESCRIPTION文件中列出软件包要求;

  2. 手动使用renv::init(bare = TRUE)+renv::install(<packages>)(或您自己的软件包安装功能(来安装您的项目所需的软件包,从您维护的某个独立源构建<packages>列表。

如果您希望renv能够实现特定的工作流程,那么您可以考虑在https://github.com/rstudio/renv/issues.

最新更新