从 CRAN 镜像安装具有依赖项的本地 R 包



我已经构建了一个R包,即我有mypackage.tar.gz文件。此软件包依赖于其他几个软件包,所有这些软件包都可以从任何CRAN镜像下载和安装。

现在我想在尚未安装依赖项的系统上安装此软件包,并且我希望在安装

软件包时自动下载并安装依赖项。

我试过了:

install.packages("mypackage.tar.gz",type="source",dependencies=TRUE,repos="http://a.cran.mirror")

但它在镜像上搜索mypackage.tar.gz(显然它没有找到(,而如果我设置repos=NULL它正确尝试安装本地包文件(如文档所述(,但显然它找不到依赖项包。

所以我的问题是:有没有办法执行"混合"安装(具有在线依赖项的本地包(或唯一的方法是手动安装所有依赖项?

您可以使用 devtools 包中的install。只需运行install("<directory of your package>", dependencies = TRUE).它的帮助指出:

使用 R CMD INSTALL 安装软件包。还将尝试从 CRAN 安装包的依赖项(如果尚未安装(。

在这里,我将untar()devtools::install()一起使用,并传入已将源压缩包解压缩到的目录。

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())

注意:我不知道如何将压缩包直接传递给install(),但是此解决方案在此期间有效并且不会留下混乱,因为我们提取到临时目录。似乎install_local()应该能够拿一个压缩包,但是我在尝试这样做时遇到了错误。

如果您已经安装了本地软件包,您应该能够在工具中使用几个函数来安装 CRAN 中的依赖项:

library('tools')
installFoundDepends(pkgDepends('mypackage', local = FALSE)$Found)

注意:您可以通过 installFoundDepends 传递参数(如 repos install.packages (。

您还可以使用 pkgDepends 输出中的 Depends 元素直接传递给 install.packages

install.packages(pkgDepends('mypackage')$Depends)

更新:显然不可能安装带有dependencies=FALSE的本地软件包。这似乎很奇怪,因为您可以从存储库对远程包执行此操作。原因(查看源代码(是if(is.null(repos) & missing(contriburl)),安装是通过对R CMD INSTALL的系统调用来处理的,它没有与依赖相关的参数。

如果您不反对使用另一个为您管理此软件包的软件包,那么现在可以使用 {remotes} 软件包轻松实现这一点。

install.packages("remotes")
remotes::install_local("mypackage.tar.gz")

您可以指定一些您想要的依赖项的其他选项(例如,"建议"中的依赖项(等:

?remotes::install_local

{remotes} 本身没有依赖项 AFAIK,因此它不会给您的环境增加太多混乱。

如此古老的问题和如此多的答案,但不幸的是,它们都没有提出解决问题的规范方法。R被设计用于处理这样的情况,不需要额外的包。必须创建本地存储库,然后在安装时将其与CRAN url一起使用作为存储库源。下面是呈现完整过程的代码。

## double check our dependency is not yet installed
## remove.packages("data.table")
"data.table" %in% rownames(installed.packages())
#[1] FALSE
## create our pkg
hello = function() "world"
package.skeleton(name="pkg", list="hello")
#...
cat("Imports: data.tablen", file="pkg/DESCRIPTION", append=TRUE)
unlink(c("pkg/Read-and-delete-me", "pkg/man"), recursive=TRUE)
rm(hello)
## publish our pkg in current working directory
system("R CMD build pkg")
#...
dir.create("src/contrib", recursive=TRUE)
file.rename("pkg_1.0.tar.gz", "src/contrib/pkg_1.0.tar.gz")
#[1] TRUE
tools::write_PACKAGES("src/contrib")
## install pkg and its dependencies automatically
install.packages("pkg", repos=c(
  paste0("file://", getwd()),
  "https://cloud.r-project.org"
))
#Installing package into '/home/jan/R/x86_64-pc-linux-gnu-library/4.2'
#(as 'lib' is unspecified)
#also installing the dependency 'data.table'
#...
## test
library(pkg)
hello()
#[1] "world
"data.table" %in% rownames(installed.packages())
#[1] TRUE

在Windows上,可能需要指定type="source"和修改路径。

最新更新