2011-06-08 62 views
27

我想知道是否有使用install.packages()或其他相关功能做如下的方式:只下载指定的包的源(即tar.gz文件)及其所有的依赖到指定的文件夹(在Windows上)。只下载源和所有依赖

这样做的一个原因是:假设我有一个Linux帐户未启用Internet访问。为了将Linux计算机上安装的软件包,我会先下载所有需要的资源我的Windows机器上,然后的FTP他们到Linux机器,并使用

install.packages('/home/me/R/Packages/blah.tar.gz', repos = NULL) 

回答

13

现在有在工具包自带的基础R这个更好的选择:package_dependencies()。例如,参见@ sebastian-c的回答以及相关用例的recent Q&A


有一个在utils包的未导出getDependencies()功能。我还没有研究它是如何工作的,但是将它与@Dirk的答案结合起来应该能让你获得最大的成功。

基本上不过,看来你使用它像:

utils:::getDependencies(pkgs, dependencies, available, lib) 

其中pkgs是包的特征向量来安装,dependencies是你想要类型的依赖关系(取决于提高等)的字符向量,availableavailable.packages()的输出,lib是评估依赖关系的包的库位置。

如果调试install.packages()它基本上是做getDependencies()步然后@德克的download.packages()一步,它实际上开始安装任何东西之前。

+0

+1谢谢! - 我正在调整utils ::: getDependencies'来让我得到依赖包的列表并忽略我已经安装的东西。这加上'download.packages'应该这样做。 – 2011-06-08 16:31:48

+0

@Prasad是不是'getDependencies()'做了什么 - 至少对我来说,它只列出了我还没有安装在'lib'中的软件包? – 2011-06-08 18:06:29

+0

正确的,但要记住我已经安装了我赢的机器上的一切,我试图让依赖的包的列表中现有的包,这样我可以得到他们的来源,ftp到Linux机器,并安装有。一旦我将所有'tar.gz'文件ftp到Linux机器上,我就会使用'install.packages('blah.tar.gz',...)'按照适当的顺序安装它们,以便一切正常。 – 2011-06-08 18:28:06

16

尝试download.packages(c("xts", "rms"), "c:/TEMP", .....) Linux机器上安装它们而不是install.packages();你可以直接在第二个参数中给它一个目标目录。

几年后编辑:如上所述,在其他答案和评论中,现在有几个辅助函数已被添加到R的工具和utils包中。 R 3.4.0将有tools::CRAN_package_db()下载顶级PACKAGES.rds文件(当然,您也可以结合使用download.file()readRDS())。

+0

这就是我的想法,但你如何选择依赖? – 2011-06-08 15:36:19

+1

可能“手动”使用'read.dcf()'和朋友来解析控制文件(你直接打了折CRAN,例如这是小红莓做什么)。哦,'cran2deb'将会有逻辑,因为它甚至会首先建立依赖关系。 – 2011-06-08 15:39:14

+0

我希望,因为'install.packages'自动地发现所有的依赖关系,会有一些办法以某种方式关闭“安装”阶段,使我们拥有一套正确的下载文件。 – 2011-06-08 15:42:46

29

最近,我有,我想下载所有的依赖问题,我已经这样解决了它:

说我想所有的依赖和ggplot2进口MASS

getPackages <- function(packs){ 
    packages <- unlist(
    tools::package_dependencies(packs, available.packages(), 
         which=c("Depends", "Imports"), recursive=TRUE) 
) 
    packages <- union(packs, packages) 
    packages 
} 

packages <- getPackages(c("ggplot2", "MASS")) 

我可以现在将软件包下载到另一个目录。

download.packages(packages, destdir="whereyouactuallywantthefiles", 
        type="source") 

从那里,如果你想使一个本地回购你的Linux PC上,按照说明here