如何使用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"))

并安装缺少的文件。它还可以更新,加载或附加它们。只是使用标准功能install.packages从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提出功能请求。