通过 library() / 描述文件使用 R 包中的依赖项

Use dependencies in R packages through library() / Description file

我正在编写一个 R 包,它有几个其他包的依赖项,其中一些在 CRAN 中可用,其他一些是自制的。

根据帮助,library("my_package") 将在我之前安装包后加载包的名称空间,即 install.package("my_package").

然而,一旦我安装了包,我就可以通过 my_package::my_function() 使用已安装但未加载的包的所有功能,所以如果我的包有依赖项,除了将它们添加到 DESCRIPTION ] 文件:

Imports:
    dplyr,
    my_package2,
    ggvis,

在包文件夹的根目录中。 我是否必须通过 library() 加载新包的依赖项,否则如果最终用户尚未在其计算机上安装,则最终用户会看到错误,因为 Imports[=25 中指定了所需的包=] 节?

不,用户不必加载 my_package 中函数使用的包。

您在 DESCRIPTION 文件中的 Imports: 下列出了一个包,这意味着在安装 my_package 期间,R 将检查您的系统上是否存在该包.这意味着 my_package 中的函数可以按照您的建议使用 :: 表示法使用这些包中的函数。

推荐使用 :: 表示法来引用其他包中的函数,但也有其他选项:

  • 为了使 dplyr 中的所有函数无需 my_package 中的 :: 即可访问,您可以将 import(dplyr) 添加到NAMESPACE 文件。如果您使用一个包中的许多函数,这很方便。

  • 如果您只打算使用 dplyr 中的函数 select,您可以将 importFrom(select, dplyr) 添加到 NAMESPACE 文件中。

  • 您也可以将包添加到 Depends: 下的 DESCRIPTION 文件中。这意味着当您使用 library(my_package) 时,包将加载到全局环境中。这几乎不是一个好的解决方案。

依赖关系的一般想法是 R 是 my_package 将加载它所依赖的包的 "it's own version"。因此,您始终可以确定自己会,例如,使用 dplyr 包中的函数 select(),如您所愿。例外是使用 Depends: 绕过该系统。在这种情况下,my_package 将在全局环境中寻找函数,如果有人应该在全局环境中定义一些名为 select() 的函数,my_package 将使用该函数,你会得到意想不到的结果结果。

示例 1:

DESCRIPTION 文件:

Imports:
    dpylr

来自 my_package 的一些函数:

my_fun <- function(...) {
    dplyr::mutate(...) %>%
    dplyr::select(1:3)
}

例二:

DESCRIPTION 文件:

Imports:
    dpylr

NAMESPACE 文件:

import(dplyr)

来自 my_package 的一些函数:

my_fun <- function(...) {
    mutate(...) %>%
    select(1:3)
}

示例 3:

DESCRIPTION 文件:

Imports:
    dpylr

NAMESPACE 文件:

importFrom(dplyr,select)

来自 my_package 的一些函数:

my_fun <- function(...) {
    dpylr::mutate(...) %>%
    select(1:3)
}

您可以在网上找到有关如何处理 R 包中的依赖项的更详细说明。例如以下是有用的:

另外,NAMESPACE文件也没有必要手写。您可以让 roxygen2 为您完成。阅读 documentation 了解更多信息。