通过库()/描述文件

时间:2016-01-19 15:04:40

标签: r r-package

我正在编写一个与其他软件包有多个依赖关系的R软件包,其中一些软件包在CRAN中可用,而其他软件包则是自制的。

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

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

Imports:
    dplyr,
    my_package2,
    ggvis,

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

1 个答案:

答案 0 :(得分:6)

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

您在Imports:文件中列出DESCRIPTION下的软件包这一事实意味着在安装my_package期间,R将检查您的系统上是否有此软件包。这意味着my_package中的函数可以使用::符号来使用这些包中的函数,如您所建议的那样。

使用::表示法是从其他包引用函数的推荐方法,但还有其他选项:

  • 为了使dplyr中的::my_package import(dplyr)可以访问所有功能,您可以将NAMESPACE添加到select文件。如果您使用包中的许多功能,这很方便。

  • 如果您打算仅使用dplyr中的importFrom(select, dplyr)功能,则可以将NAMESPACE添加到DESCRIPTION文件中。

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

依赖关系的一般概念是R select()将拥有"它自己的版本"它依赖于加载的包。因此,您可以随时确保使用dplyr包中的Depends:功能,如您所愿。使用绕过此系统的my_package是个例外。在这种情况下,select()将在全局环境中查找函数,如果有人在全局环境中定义了一个名为my_package的函数,DESCRIPTION将使用此函数,您将获得意外结果

示例1:

Imports: dpylr 档案:

my_package

来自my_fun <- function(...) { dplyr::mutate(...) %>% dplyr::select(1:3) } 的一些功能:

DESCRIPTION

示例2:

Imports: dpylr 档案:

NAMESPACE

import(dplyr) 档案:

my_package

来自my_fun <- function(...) { mutate(...) %>% select(1:3) } 的一些功能:

DESCRIPTION

示例3:

Imports: dpylr 档案:

NAMESPACE

importFrom(select, dplyr) 档案:

my_package

来自my_fun <- function(...) { dpylr::mutate(...) %>% select(1:3) } 的一些功能:

{{1}}

您可以找到有关如何在Web上处理R包中的依赖关系的更详细说明。例如,以下内容非常有用: