为什么不应在 R 包中使用 library() 或 require()

Why library() or require() should not be used in a R package

我的目标是创建使用其他库(如 grid 和 ggplot2)的 R 包。
根据 https://tinyheero.github.io/jekyll/update/2015/07/26/making-your-first-R-package.html,据说在R包中不应该使用library()或require()

我的问题是:
1)有原因吗? (因为,尽管我将 library("ggplot2") 和 library("grid") 放在我包中的 R 脚本中,但它仍然有效)。
2)我是否必须在我的代码中删除库(“ggplot2”)和库(“网格”)并放置“::”,例如ggplot2::geom.segment()?

有没有一种有效的方法可以将脚本转换为包脚本?

切勿在包中使用 library()require(),因为它们会影响用户的搜索列表,可能会导致用户出错。

例如,dplyrstats 包都导出一个名为 filter 的函数。如果一个用户只有 library(stats),那么 filter 就意味着 stats::filter,但是如果你的包裹叫 library(dplyr),用户可能会突然发现 filter 意味着 dplyr::filter,然后事情就会崩溃。

您的包裹有多种选择。您可以通过在 DESCRIPTION 文件的 Imports: 字段中列出它并在 NAMESPACE 文件中指定导入来从另一个包导入函数。 (如果您在 .R 源文件中添加适当的注释,roxygen2 包可以自动为您进行这些更改,例如

#' @importFrom jsonlite toJSON unbox

在使用它们从 jsonlite 包中导入 toJSON()unbox() 的函数之前。)

另一种方法是使用 :: 表示法。然后你仍然可以在 DESCRIPTIONImports: 字段中列出一个包,但是使用像

这样的代码
jsonlite::toJSON(...)

每次你想调用它。或者,如果你不想对 jsonlite 有很强的依赖性,你可以将 jsonlite 放在 Suggests: 中,并将它的任何使用包装在像

这样的代码中
if (requireNamespace("jsonlite")) {
  jsonlite::toJSON(...)
}

那么没有那个包的人仍然可以 运行 你的功能,但它可能会跳过一些需要 jsonlite.

的操作