R 包构建:如何从不在 CRAN 上的包中导入函数

R package building: How to import a function from a package not on CRAN

问题

我正在尝试将一个函数从非 CRAN 存储库导入到我的包中。 我知道 R 在 CRAN 中搜索在 DESCRIPTION 文件的 Imports: 字段中声明的任何包。有没有办法,例如,从包 'notoncran' 导入 function,它只在 Github(或其他一些非 CRAN 地方)。

不理想的解决方法:

我已经制定了一个不理想的解决方法,其中包括通过将我的函数定义为类似以下内容来完全绕过 Imports: 字段:

myfun <- function(a,b){
    x <- require(notoncran)
    if(!x){
        print("installing notoncran because you don't have it...")
        devtools::install_github('repo/withpackage')
        require(notoncran)
    }
    ...
}

出于原则,我不喜欢这个想法,因为您在某种程度上未经用户同意从可能不受监管(理论上危险)的来源安装了 a/several 软件包。这也在一定程度上降低了函数的可读性,将函数与管理业务进行了权衡。最后,这种方法最终会需要 运行 require()library(),将包的所有功能都扔到用户的命名空间中,这绝不是理想的。

感谢您对此提供的任何帮助。

一个超级简单的技巧是在我们的 DESCRIPTION 文件中添加一个“远程”字段,指定 Github.

上目标包的 username/package_name 目标
Remotes:
    github::User/PackageNotOnCRAN
Import:
    PackageNotOnCRAN
Suggests:
    devtools,
    testthat

这不仅适用于 github (github::) 上的文件,而且适用于 git、bitbucket、本地包等。

More information, how I figured it out.