从 CRAN 镜像安装具有依赖项的本地 R 包
Posted
技术标签:
【中文标题】从 CRAN 镜像安装具有依赖项的本地 R 包【英文标题】:Install a local R package with dependencies from CRAN mirror 【发布时间】:2014-09-20 22:28:22 【问题描述】:我已经构建了一个 R 包,即我有 mypackage.tar.gz 文件。这个包依赖于其他几个包,都可以从任何 CRAN 镜像下载和安装。
现在我想在尚未安装依赖项的系统上安装此包,我希望在安装包时自动下载并安装依赖项。
我试过了:
install.packages("mypackage.tar.gz",type="source",dependencies=TRUE,repos="http://a.cran.mirror")
但它在镜像上搜索mypackage.tar.gz
(显然它没有找到),而如果我设置repos=NULL
,它会正确尝试安装本地包文件(如文档所述),但显然它没有找到依赖包。
所以我的问题是:有没有办法执行“混合”安装(具有在线依赖项的本地包)或唯一的方法是手动安装所有依赖项?
【问题讨论】:
相关(可能重复):***.com/questions/5805049/… 惊讶于 R 默认情况下没有提供执行此操作的机制。这不是包管理101吗? 【参考方案1】:在这里,我将untar()
与devtools::install()
一起使用,并传入一个已提取源tarball 的目录。
d <- tempdir()
untar("mypackage.tar.gz", compressed="gzip", exdir=d)
devtools::install(file.path(d, "mypackage"), dependencies=TRUE,
repos="https://cloud.r-project.org/")
如果您想从多个存储库安装,您可以提供它们的列表。例如,要同时使用 Bioconductor 和 CRAN,您可以运行:
devtools::install(file.path(d, "mypackage"), dependencies=TRUE,
repos=BiocManager::repositories())
注意:我不知道如何直接将 tarball 传递给install()
,但是这个解决方案同时工作并且不会留下任何混乱,因为我们提取到一个临时目录。似乎install_local()
应该能够获取 tarball,但尝试这样做时出现错误。
【讨论】:
install_local()
完全符合我的需要。【参考方案2】:
您可以使用 devtools 包中的install
。只需运行install("<directory of your package>", dependencies = TRUE)
。它的帮助说明:
使用 R CMD INSTALL 安装包。如果尚未安装,还将尝试从 CRAN 安装包的依赖项。
【讨论】:
【参考方案3】:如果你已经安装了本地包,你应该可以使用 tools 中的几个函数从 CRAN 安装依赖项:
library('tools')
installFoundDepends(pkgDepends('mypackage', local = FALSE)$Found)
注意:您可以通过installFoundDepends
将参数(如repos
)传递给install.packages
。
您还可以使用pkgDepends
输出中的Depends
元素直接传递给install.packages
:
install.packages(pkgDepends('mypackage')$Depends)
更新:显然无法使用dependencies=FALSE
安装本地软件包。这看起来很奇怪,因为您可以对存储库中的远程包执行此操作。原因(looking at the source code)是if(is.null(repos) & missing(contriburl))
,安装是通过对R CMD INSTALL
的系统调用来处理的,它没有与依赖相关的参数。
【讨论】:
如果我还没有安装本地包的所有依赖项,我将无法安装它。 不幸的是它不起作用,即使将依赖项设置为 FALSE,实际上手册页明确指定将 repos 设置为 NULL(需要安装本地包),依赖项参数被忽略。跨度> @WoDoSc 好的,许多进一步的测试表明这真的很烦人和令人惊讶。我实际上认为能够在没有依赖关系的情况下安装本地包是 R 的一个非常合理的功能请求,值得提交。以上是关于从 CRAN 镜像安装具有依赖项的本地 R 包的主要内容,如果未能解决你的问题,请参考以下文章