在一个R包中安装缺失的依赖项

3
我正在分发一个需要其他包的R软件包。如果缺少任何包,我会得到(例如)以下错误:

library(whSample) Error: package or namespace load failed for ‘whSample’ in loadNamespace(i, c(lib.loc, .libPaths()), versionCheck = vI[[i]]): there is no package called ‘dplyr’

我有代码来检查和安装whSample软件包中的依赖项,但是当R看到NAMESPACE中的import(dplyr)时,在它到达这些代码之前就会失败。以下是调用软件包函数时的第一个代码块:
  is_installed <- function(mypkg) is.element(mypkg, installed.packages()[,1])
  whInstall <- function(pkgNames){
    for(pkg in pkgNames){
      if(!is_installed(pkg)){
        install.packages(pkg, repos="http://lib.stat.cmu.edu/R/CRAN")
      }
      suppressMessages(suppressWarnings(
        library(pkg, character.only=T, quietly=T, verbose=F)))
    }
  }
  whInstall(c("magrittr","tools","purrr","openxlsx","data.table","dplyr","glue"))```

How can I get R to do these checks without running afoul of NAMESPACE?

1
这是你内部网络上的一个包,还是你打算在CRAN上分发? - Waldi
1
你为什么要这样做?如果你的NAMESPACE文件正确,install.packages将会安装所有包依赖项(如果它们在CRAN或指定的存储库中)。在一个包中不需要展示你所展示的代码。 - Roland
目前这只是为我的工作场所而准备的,并没有完全准备好放到CRAN上,尽管我希望在它被充分调试后可以放上去。NAMESPACE数据是从.R文件生成的,其中包含代码#'@import dplyr(和其它)。我需要做更多的事情吗? - pdw
不,这将确保在安装您的软件包时安装dplyr(如果尚未安装)。 (通常,最好不要导入整个软件包命名空间,而是使用#' @importFrom选择性地导入函数。) - Roland
谢谢Roland,但情况变得更加复杂了。那些不熟悉R的人正在本地安装二进制(zip)文件,但当他们尝试加载库时会出现错误。如果我让他们首先从CRAN安装所有内容,一切都可以正常工作。我尽可能使用importFrom(6次),但对于openxlsx、dplyr和glue,由于需要使用多个函数,所以使用import。我是否应该尝试在外部包中的每个函数中使用importFrom? - pdw
将要发布到CRAN的资格测试非常严格,这是有原因的 :-)。遵循它们,您在本地的问题将不复存在。避免使用拙劣的解决方法,因为它们会永远困扰着你。 - Carl Witthoft
2个回答

3
简单回答是,您可以要求人们使用以下方式进行安装:
devtools::install_local("your-package.tar.gz")

在幕后发生的事情是,当从本地文件安装时,install.packages会忽略dependencies选项。它会假设你从中安装软件包的仓库也应该有相关依赖包。但对于本地文件,没有仓库,因此不会处理依赖项。

0
当您从本地文件安装软件包时,安装程序将在相同的本地路径上搜索依赖项...但是找不到它们。
为了自动安装CRAN依赖项,您可以使用以下方法:
install.packages("devtools")
devtools::install_local("MypackageName.zip")

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