离线安装 R 包及其依赖项

62

假设我需要在一台没有网络连接的(Linux)机器上安装许多软件包。假设我下载了 CRAN 的副本并将其刻录到 DVD 上,然后带到离线位置:

wget ftp://cran.r-project.org/pub/R/src/contrib/*.tar.gz

我甚至可以添加一个 PACKAGES 文件,其中包含所有源软件包及其依赖项的概述:

library(tools)
write_PACKAGES()

我该如何离线使用此方法来安装源代码包,以便解决依赖关系并从本地文件中安装它们?例如,某人想要安装ggplot2包,它具有相当深的依赖结构。假设ggplot2的源代码包及其所有依赖项都作为源代码包在当前工作目录中可用。如果我执行以下操作:

install.packages("ggplot2_0.9.1.tar.gz", repos=NULL)

这会导致错误,因为依赖项根本没有得到解决。或者,您可以尝试以下方法:

install.packages(list.files(pattern="*.tar.gz"), repos=NULL)

然而这种方法也忽略了依赖关系,并尝试按字母顺序安装软件包,这样也会失败。

我研究了available.packagescontrib.url,但我找不到一个从本地文件安装源软件包及其依赖项的例子。


7
似乎 repos="file://path/to/DVD" 可以起作用。 - Joshua Ulrich
3
您应该加入一个包含这些信息的答案。 - Matthew Lundberg
3个回答

48

问题的评论区由Joshua Ulrich提供了正确的答案:

关键是将参数添加前缀file://,然后与repos或者contriburl一起使用。所以在Unix系统中可以这样做:

install.packages("ggplot2", contriburl="file:///path/to/packages/")

假设所有必需的源包以及一个PACKAGES索引文件都可在/path/to/packages中找到。如果没有PACKAGES文件,则应首先使用以下命令进行生成:

library(tools)
write_PACKAGES("/path/to/packages/")

这将生成一个索引,列出此目录中找到的所有源包。请注意,在示例中,file:前缀后面有3个斜杠。第三个斜杠表示相对于文件系统根目录的路径。

reposcontriburl参数之间的区别在于,repos会将另一个/src/contrib附加到指定的路径上,因为这通常是官方CRAN存储库镜像上源包所在的位置。


我不得不使用contriburl而不是contrib.url - jrouquie
2
该命令在大多数情况下可以正确安装软件包,但在需要下载额外数据的软件包(例如'stringi')中失败。我手动下载了数据,但如何让R知道数据路径? - bourneli
当我尝试这样做时,出现了一个错误,显示为“install.packages: error reading from connection”,能否帮助我一下。我可以编写用于生成索引文件的包,但是使用contriburl安装包失败了。 - The Great

4

参考上面的答案,如果安装在Windows上,则write_PACKAGES()会在所有zip文件放置的'/path/to/packages/'目录下生成两个文件:PACKAGES和PACKAGES.gz。在正确安装install.packages()函数之前,应该删除PACKAGES.gz文件,否则会出现“无法打开压缩文件”的错误。


0

我在离线安装过程中也遇到了相同的问题。不知何故,命令行方式无法工作。

我下载并提取了所有依赖项(注意所需的最低版本),然后将文件夹粘贴到库文件夹中。这种方式只解决了我的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接