为什么不应在 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()
,因为它们会影响用户的搜索列表,可能会导致用户出错。
例如,dplyr
和 stats
包都导出一个名为 filter
的函数。如果一个用户只有 library(stats)
,那么 filter
就意味着 stats::filter
,但是如果你的包裹叫 library(dplyr)
,用户可能会突然发现 filter
意味着 dplyr::filter
,然后事情就会崩溃。
您的包裹有多种选择。您可以通过在 DESCRIPTION
文件的 Imports:
字段中列出它并在 NAMESPACE
文件中指定导入来从另一个包导入函数。 (如果您在 .R
源文件中添加适当的注释,roxygen2
包可以自动为您进行这些更改,例如
#' @importFrom jsonlite toJSON unbox
在使用它们从 jsonlite
包中导入 toJSON()
和 unbox()
的函数之前。)
另一种方法是使用 ::
表示法。然后你仍然可以在 DESCRIPTION
的 Imports:
字段中列出一个包,但是使用像
这样的代码
jsonlite::toJSON(...)
每次你想调用它。或者,如果你不想对 jsonlite
有很强的依赖性,你可以将 jsonlite
放在 Suggests:
中,并将它的任何使用包装在像
这样的代码中
if (requireNamespace("jsonlite")) {
jsonlite::toJSON(...)
}
那么没有那个包的人仍然可以 运行 你的功能,但它可能会跳过一些需要 jsonlite
.
的操作
我的目标是创建使用其他库(如 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()
,因为它们会影响用户的搜索列表,可能会导致用户出错。
例如,dplyr
和 stats
包都导出一个名为 filter
的函数。如果一个用户只有 library(stats)
,那么 filter
就意味着 stats::filter
,但是如果你的包裹叫 library(dplyr)
,用户可能会突然发现 filter
意味着 dplyr::filter
,然后事情就会崩溃。
您的包裹有多种选择。您可以通过在 DESCRIPTION
文件的 Imports:
字段中列出它并在 NAMESPACE
文件中指定导入来从另一个包导入函数。 (如果您在 .R
源文件中添加适当的注释,roxygen2
包可以自动为您进行这些更改,例如
#' @importFrom jsonlite toJSON unbox
在使用它们从 jsonlite
包中导入 toJSON()
和 unbox()
的函数之前。)
另一种方法是使用 ::
表示法。然后你仍然可以在 DESCRIPTION
的 Imports:
字段中列出一个包,但是使用像
jsonlite::toJSON(...)
每次你想调用它。或者,如果你不想对 jsonlite
有很强的依赖性,你可以将 jsonlite
放在 Suggests:
中,并将它的任何使用包装在像
if (requireNamespace("jsonlite")) {
jsonlite::toJSON(...)
}
那么没有那个包的人仍然可以 运行 你的功能,但它可能会跳过一些需要 jsonlite
.