繁体   English   中英

安装本地 R package 依赖来自 CRAN 镜像

[英]Install a local R package with dependencies from CRAN mirror

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

现在我想在尚未安装依赖项的系统上安装这个 package,我希望在安装我的 package 时自动下载并安装依赖项。

我试过了:

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

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

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

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

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

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

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

注意:您可以通过installFoundDepends将 args(如repos )传递给install.packages

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

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

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

在这里,我将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,但是在尝试这样做时出现错误。

我个人使用RStudio来告诉你缺少哪些依赖项。 然后我在下面的小脚本的参数中复制字符串来改变经典的“奇怪”符号“(xclip正在复制到剪贴板[就像在macOS上的pbcopy])。

#!/bin/bash
echo $@ | sed 's/‘/"/g' | sed 's/’/"/g' | xclip -selection clipboard

然后我只使用install.packages(c(ctrl_v__what_to_install))并且R开始安装所有依赖项。

注意:请记住,这两个'写在上面的脚本是不同的,您复制此脚本的第一次,我劝再次复制原始引号字符。

如果您不反对使用另一个 package 来为您管理,现在可以使用 {remotes} package 轻松实现。

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.table\n", 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"并修改路径。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM