首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用renv显式管理依赖项

如何使用renv显式管理依赖项
EN

Stack Overflow用户
提问于 2020-10-31 21:07:03
回答 2查看 152关注 0票数 1

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

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

EN

回答 2

Stack Overflow用户

发布于 2020-11-01 00:53:25

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

代码语言:javascript
复制
loadPackages <- function() {
  requireNamespace("foo")
  requireNamespace("bar")
   ...
}

为了让renv更容易找到你需要的包,但是如果它在其他方面失败了(例如,你有不完整的文件,不能正确地解析),这是没有用的。

如果你不需要这些花哨的东西,你可以使用下面的函数:

代码语言:javascript
复制
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)
}

这是我在一个项目中使用的。你把它叫做

代码语言:javascript
复制
needsPackages(c("foo", "bar"))

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

票数 1
EN

Stack Overflow用户

发布于 2020-11-02 13:11:39

这里有两种可能的方法:

  1. renv配置为使用“显式”快照,如https://rstudio.github.io/renv/reference/snapshot.html#snapshot-type中所述-此工作流要求您在DESCRIPTION文件中列出软件包要求;

  1. 手动使用renv::init(bare = TRUE) + renv::install(<packages>) (或您自己的软件包安装函数)安装项目所需的软件包,从您维护的一些单独的源构建<packages>列表。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64622006

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档