从本地回购安装具有依赖关系的包时出错

时间:2016-04-08 10:03:25

标签: r install packages offline cran

我在离线安装包时遇到依赖关系时出错。这与this question非常相似。我按照那里的说明进行离线安装。 所以我已经将所有CRAN软件包安装到一个目录中,并创建了PACKAGES文件。

但该答案中概述的流程似乎存在一个微妙的错误

我可以使用下面的命令从Linux上的本地存储库安装一个包,即没有指定存储库:

install.packages("/software/r_packages/src/contrib/ZillowR_0.1.0.tar.gz",     lib="/usr/lib64/R/library")

但是,如果我想要获取依赖项,我需要使用例如将其指向repo及其PACKAGES文件。

install.packages("/software/r_packages/src/contrib/ZillowR_0.1.0.tar.gz",     lib="/usr/lib64/R/library", repos="file:///software/r_packages/")

但如果我这样做,我会收到错误:

Warning message:
package ‘/software/r_packages/src/contrib/ZillowR_0.1.0.tar.gz’ is not available (for R version 3.2.3)

我已经测试并确认它正在读取PACKAGES文件,因为如果我在PACKAGES的ZillowR条目中输入拼写错误,我会收到错误消息,指出它无法正确解析条目。

1 个答案:

答案 0 :(得分:1)

这里应该适合您的是:

install.packages(pkgs = "ZillowR", type = "source", 
                 lib = "/usr/lib64/R/library", 
                 contriburl = "file:///software/r_packages/")

install.packages()的参数非常庞大,所有默认值都配置为使用从CRAN(或其他远程存储库)安装的软件包。要解压缩在此处发生的事情,请考虑以下代码从CRAN安装ZillowR:

install.packages(pkgs = "ZillowR")

这设置了很多默认值,所以你实际上是在调用:

install.packages(pkgs = "ZillowR", lib = .libPaths()[1], 
                 repos = getOption("repos"),
                 contriburl = contrib.url(repos, type),
                 type = getOption("pkgType"))

两个关键默认值是调用一些全局选项,我的安装设置为:

> getOption("repos")
                                CRAN                            CRANextra 
       "https://cloud.r-project.org" "http://www.stats.ox.ac.uk/pub/RWin" 
> getOption("pkgType")
[1] "both"

你需要(可能)克服这些默认值以进行本地安装,而要克服的关键是contriburl的值(继承自repos。知道这一点,你的直觉出现了(正确地)遵循installing a local source package的说明,例如:

install.packages(pkgs = "/software/r_packages/src/contrib/ZillowR_0.1.0.tar.gz", repos = NULL, type = "source")

但是install.packages()的行为完全不同,因为pkgs参数期望源tarball的 filename (当reposcontriburl NULL 1}}是pkgs)。

使用类似CRAN的本地仓库,您实际上想要将contriburl设置为包名称并将contriburl设置为本地仓库路径。作为参考,contriburlthe relevant section of the docs

  

type = "source"存储库的contrib部分的URL。如果您的存储库镜像不完整,请使用此参数,例如,因为您只刻录了CD上的“contrib”部分,或者只有二进制包。覆盖参数repos。与type =“both”不兼容。

最后一句显示您(可能)需要设置INSERT INTO category (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, vendor_brand_id) SELECT T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, vendor_brand_id FROM ( SELECT CAST('one' AS CHAR CHARACTER SET latin1) AS T1, CAST('two' AS CHAR CHARACTER SET latin1) AS T2, CAST('three' AS CHAR CHARACTER SET latin1) AS T3, NULL AS T4, NULL AS T5, NULL AS T6, NULL AS T7, NULL AS T8, NULL AS T9, NULL AS T10, 7 AS vendor_brand_id) AS t WHERE NOT EXISTS (SELECT * FROM category AS c WHERE c.T1 = t.T1 AND c.T2 = t.T2 AND c.T3 = t.T3 AND c.vendor_brand_id = t.vendor_brand_id)

的原因