2

我想packrat在没有互联网连接的 Windows 7 机器上使用。我已将所有二进制包下载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不搜索本地 二进制包......

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

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

4

1 回答 1

2

我设法解决了这个问题。请记住,我以前从未使用packrat过,而且我不知道它的“正确”行为。但我的印象是黑客的作品。这是我的做法:

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

    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!保存并关闭文件。

  6. 创建/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(我没有找到更好的方法来改变它......)

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

  8. 再次打开yourProjDir/.Rprofile并在最后添加

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

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

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

  10. 现在您可以执行packrat::init(),它应该可以正常运行。

如果有更多经验的人packrat可以提供他/她的意见,那就太好了,这样我就可以确定这个黑客是有效的。当然,任何指向正确解决方案的指针都会受到高度赞赏。

于 2015-07-09T13:43:08.310 回答