我想在没有互联网连接的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
试图找到
Rcpp
二进制版本(因为没有互联网连接而失败)Rcpp
的来源(由于没有互联网连接而失败)我不明白为什么packrat
也不会搜索本地 二进制包...
问题1:我可以下载源CRAN存储库来解决此问题。但我想告诉大家,是否有一个更简单的解决方案,即,是否有可能使packrat
接受本地二进制仓库。
问题2 :当我在启用了packrat的情况下创建自己的包myPackage
时,包中还会包含myPackage
特定的本地packrat
库?也就是说,假设我将二进制myPackage
zip文件提供给我的一位没有myPackage
所依赖的软件包的同事(让我们说Rcpp
) 。当我使用Rcpp
时,myPackage
会包含packrat
吗?或者我的同事是否必须自己安装Rcpp
?
答案 0 :(得分:2)
我设法解决了这个问题。请记住,我以前从未使用过packrat
而且我不知道它的#34;正确的"行为。但我的印象是黑客行事。
我是这样做的:
packrat
library(packrat)
fixInNamespace("snapshotImpl",ns="packrat")
- 打开一个窗口 - 将其内容复制到剪贴板/yourProjDir/
并创建文件snapshotImplFix.R
...但是将第一行更改为
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
!保存并关闭文件。
创建/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
的问题(我没有找到更好的方法来改变它......)
最后,我们必须告诉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");
。
再次打开yourProjDir/.Rprofile
并在最后添加
local({r=getOption("repos");r["CRAN"]="file:///C:/xyz/CRAN_3_1";r["CRANextra"]=r["CRAN"];options(repos=r)})
请注意/
之后的3 file
!保存并退出文件。
关闭项目并重新打开。
现在您可以执行packrat::init()
,它应该可以正常运行。
如果对packrat
有更多经验的人能够提供他/她的输入以便我确信这个黑客行之有效,那就太棒了。当然,任何指向正确解决方案的指针都非常受欢迎。