通过library()/Description文件在R包中使用依赖项

通过library()/Description文件在R包中使用依赖项,r,r-package,R,R Package,我正在编写一个R包,它与其他包有几个依赖关系,其中一些在CRAN中可用,其他的是自制的 根据帮助,librarymy_软件包将在我之前安装该软件包后加载该软件包的名称空间,即install.packagemy_软件包 尽管如此,一旦安装了软件包,我就可以通过my_package::my_函数使用已安装但未加载的软件包的所有功能,因此,如果我的软件包具有依赖项,除了将它们添加到描述文件中之外: 在包文件夹的根目录中。 是否必须通过库加载新软件包的依赖项,或者如果最终用户没有在其计算机上安装所需的软

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

根据帮助,librarymy_软件包将在我之前安装该软件包后加载该软件包的名称空间,即install.packagemy_软件包

尽管如此,一旦安装了软件包,我就可以通过my_package::my_函数使用已安装但未加载的软件包的所有功能,因此,如果我的软件包具有依赖项,除了将它们添加到描述文件中之外:

在包文件夹的根目录中。
是否必须通过库加载新软件包的依赖项,或者如果最终用户没有在其计算机上安装所需的软件包,则最终用户将看到错误,因为在“导入”部分中指定了所需的软件包?

否,用户不必加载my_软件包中的函数所使用的软件包

您在描述文件的Imports:下列出了一个包,这意味着在安装my_包的过程中,R将检查您的系统上是否有此包。这意味着my_包中的函数可以使用::符号使用这些包中的函数,正如您所建议的那样

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

为了使dplyr中的所有函数在my_包中无需::即可访问,您可以将importdplyr添加到名称空间文件中。如果您使用一个包中的许多函数,这是很方便的

如果只打算使用函数select from dplyr,可以将importFromselect、dplyr添加到名称空间文件中

您还可以将包添加到Dependes:下的描述文件中。这意味着当您使用librarymy_包时,该包将加载到全局环境中。这几乎从来都不是一个好的解决方案

依赖关系的一般概念是R,我的_包将有它自己的版本,它依赖于加载的包。因此,您可以始终确保,例如,您将按照预期使用dplyr软件包中的功能select。例外情况是使用Depends:绕过此系统。在这种情况下,my_包将在全局环境中查找函数,如果有人应该在全局环境中定义一些名为select的函数,my_包将使用此函数,您将得到意外的结果

例1:

说明文件:

my_软件包中的某些功能:

命名空间文件:

my_软件包中的某些功能:

命名空间文件:

my_软件包中的某些功能:

您可以找到关于如何在web上处理R包中的依赖关系的更详细的解释。例如,以下内容很有用:


此外,不必手动编写名称空间文件。你可以让roxygen2帮你做。有关更多信息,请阅读

您不应该在包中使用库。原因是,您的包代码在构建过程中执行一次。因此,您应该坚持使用描述文件中的依赖项字段。有关更多详细信息,请查看Hadley Wickham:@martindabbeljumelter中有关依赖项的文章。我认为,不使用库的更重要原因是,它会污染包用户的搜索。图书馆无权更改会话的全局状态。不幸的是,R有时会让这变得很困难,而且许多包的行为很糟糕。在使用时,我会将“几乎从不”改为“从不”…但我知道有些人不同意这一点。然而,考虑到您正在污染用户的全局状态,并可能改变其他加载的包的语义。但我也经历过这样的情况:我导入的包需要另一个包加载到全局环境中,而我却无法使用它。因此,其他软件包中糟糕的设计似乎也会迫使用户使用它。这就是我的意思:不应该使用它,但有时没有其他实用的方法。语法是importFrompackage,function,而不是importFromselect,dplyr。@sindri_baldur你当然是对的。谢谢你的提示!
Imports:
    dplyr,
    my_package2,
    ggvis,
Imports:
    dpylr
my_fun <- function(...) {
    dplyr::mutate(...) %>%
    dplyr::select(1:3)
}
Imports:
    dpylr
import(dplyr)
my_fun <- function(...) {
    mutate(...) %>%
    select(1:3)
}
Imports:
    dpylr
importFrom(dplyr,select)
my_fun <- function(...) {
    dpylr::mutate(...) %>%
    select(1:3)
}