带有本地二进制存储库的 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
试图找到
- CRAN 上
Rcpp
的二进制版本(由于没有互联网连接而失败)
- CRAN 上
Rcpp
的来源(由于没有互联网连接而失败)
- 包的本地源(失败,因为我只有二进制文件)
我不明白的是为什么 packrat
也没有搜索 local binary 包...
问题 1:我可以下载源 CRAN 存储库来解决这个问题。但我想从你们那里知道是否有更简单的解决方案,即,是否有可能使 packrat
接受本地二进制 repo。
问题 2:当我创建自己的包 myPackage
并启用 packrat 时,myPackage
-特定的本地 packrat
库是否也会包含在包中?也就是说,假设我将二进制 myPackage
zip 文件提供给我的一位同事,他没有 myPackage
所依赖的软件包之一(假设 Rcpp
)。当我使用packrat
时,Rcpp
会被包含在myPackage
中吗?还是我的同事必须自己安装 Rcpp
?
我设法解决了这个问题。请记住,我以前从未使用过 packrat
并且我不知道它的 "proper" 行为。但我的印象是黑客有效。
这是我的做法:
- 打开您的项目,通过
library(packrat)
加载 packrat
- 键入
fixInNamespace("snapshotImpl",ns="packrat")
- 打开 window - 将其内容复制到剪贴板
- 转到
/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)})
注意 file
之后的 3 /
!保存并退出文件。
关闭项目并重新打开。
现在你可以执行 packrat::init()
并且它应该 运行 没有错误。
如果在 packrat
方面有更多经验的人可以提供 his/her 意见,这样我就可以确定这个 hack 有效。当然,我们非常感谢任何指向正确解决方案的建议。
我想在没有互联网连接的 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
试图找到
- CRAN 上
Rcpp
的二进制版本(由于没有互联网连接而失败) - CRAN 上
Rcpp
的来源(由于没有互联网连接而失败) - 包的本地源(失败,因为我只有二进制文件)
我不明白的是为什么 packrat
也没有搜索 local binary 包...
问题 1:我可以下载源 CRAN 存储库来解决这个问题。但我想从你们那里知道是否有更简单的解决方案,即,是否有可能使 packrat
接受本地二进制 repo。
问题 2:当我创建自己的包 myPackage
并启用 packrat 时,myPackage
-特定的本地 packrat
库是否也会包含在包中?也就是说,假设我将二进制 myPackage
zip 文件提供给我的一位同事,他没有 myPackage
所依赖的软件包之一(假设 Rcpp
)。当我使用packrat
时,Rcpp
会被包含在myPackage
中吗?还是我的同事必须自己安装 Rcpp
?
我设法解决了这个问题。请记住,我以前从未使用过 packrat
并且我不知道它的 "proper" 行为。但我的印象是黑客有效。
这是我的做法:
- 打开您的项目,通过
library(packrat)
加载 - 键入
fixInNamespace("snapshotImpl",ns="packrat")
- 打开 window - 将其内容复制到剪贴板 - 转到
/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)})
注意
file
之后的 3/
!保存并退出文件。关闭项目并重新打开。
现在你可以执行
packrat::init()
并且它应该 运行 没有错误。
packrat
如果在 packrat
方面有更多经验的人可以提供 his/her 意见,这样我就可以确定这个 hack 有效。当然,我们非常感谢任何指向正确解决方案的建议。