带有本地二进制存储库的 Packrat

Packrat with local binary repository

我想在没有互联网连接的 Windows 7 机器上使用 packrat。 我已将 http://cran.r-project.org/bin/windows/contrib/3.1/ 中的所有二进制包下载到本地文件夹 C:/xyz/CRAN_3_1.

现在的问题是

packrat::init(options=list(local.repos="C:/xyz/CRAN_3_1"))

抛出一堆警告和错误,例如

Warning: unable to access index for repository http://cran.rstudio/bin/...
Warning: unable to access index for repository http://cran.rstudio/src/...
Fetching sources for Rcpp (0.11.4) ... Failed
Package Rcpp not available in repository or locally

似乎packrat 试图找到

  1. CRAN 上 Rcpp 的二进制版本(由于没有互联网连接而失败)
  2. CRAN 上 Rcpp 的来源(由于没有互联网连接而失败)
  3. 包的本地源(失败,因为我只有二进制文件)

我不明白的是为什么 packrat 也没有搜索 local binary 包...

问题 1:我可以下载源 CRAN 存储库来解决这个问题。但我想从你们那里知道是否有更简单的解决方案,,是否有可能使 packrat 接受本地二进制 repo。

问题 2:当我创建自己的包 myPackage 并启用 packrat 时,myPackage-特定的本地 packrat 库是否也会包含在包中?也就是说,假设我将二进制 myPackage zip 文件提供给我的一位同事,他没有 myPackage 所依赖的软件包之一(假设 Rcpp)。当我使用packrat时,Rcpp会被包含在myPackage中吗?还是我的同事必须自己安装 Rcpp

我设法解决了这个问题。请记住,我以前从未使用过 packrat 并且我不知道它的 "proper" 行为。但我的印象是黑客有效。 这是我的做法:

  1. 打开您的项目,通过 library(packrat)
  2. 加载 packrat
  3. 键入 fixInNamespace("snapshotImpl",ns="packrat") - 打开 window - 将其内容复制到剪贴板
  4. 转到 /yourProjDir/ 并创建一个文件 snapshotImplFix.R
  5. 将剪贴板的内容复制到此文件中...
  6. ...但将第一行更改为

    snapshotImplFix=function (project, available = NULL, lib.loc = libDir(project), dry.run = FALSE, ignore.stale = FALSE, prompt = interactive(), auto.snapshot = FALSE, verbose = TRUE, fallback.ok = FALSE, snapshot.sources = FALSE)

    注意snapshot.sources = FALSE!保存并关闭文件。

  7. 创建/yourProjDir/.Rprofile并添加

    setHook(packageEvent("packrat","onLoad"),function(...) { source("./snapshotImplFix.R"); tmpfun=get("snapshotImpl",envir=asNamespace("packrat")); environment(snapshotImplFix)=environment(tmpfun); utils::assignInNamespace(x="snapshotImpl",value=snapshotImplFix,ns="packrat");})

    第 2-6 点解决了 snapshot.sources 参数默认为 TRUE 的问题(我没有找到更好的方法来改变它...)

  8. 最后,我们必须告诉 packrat 获取我们的本地存储库。拥有正确的文件夹结构很重要。因此,我将存储库从 C:/xyz/CRAN_3_1 移到了 C:/xyz/CRAN_3_1/bin/windows/contrib/3.1。如果您还必须移动文件,请不要忘记 运行 library(tools);write_PACKAGES("C:/xyz/CRAN_3_1/bin/windows/contrib/3.1");

  9. 再次打开yourProjDir/.Rprofile,在末尾添加

    local({r=getOption("repos");r["CRAN"]="file:///C:/xyz/CRAN_3_1";r["CRANextra"]=r["CRAN"];options(repos=r)})

    注意 file 之后的 3 /!保存并退出文件。

  10. 关闭项目并重新打开。

  11. 现在你可以执行 packrat::init() 并且它应该 运行 没有错误。

如果在 packrat 方面有更多经验的人可以提供 his/her 意见,这样我就可以确定这个 hack 有效。当然,我们非常感谢任何指向正确解决方案的建议。