gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:16:07 24 4
gpt4 key购买 nike

我的目标是创建使用其他库(例如 grid 和 ggplot2)的 R 包。
根据
https://tinyheero.github.io/jekyll/update/2015/07/26/making-your-first-R-package.html ,据说 library() 或 require() 不应该在 R 包中使用。
我的问题是:
1)有原因吗? (因为,尽管我将 library("ggplot2") 和 library("grid") 放在包中的 R 脚本中,但它仍然有效)。
2)我是否必须在我的代码中删除 library("ggplot2") 和 library("grid") 并放置“::”,例如 ggplot2::geom.segment()?
有没有一种有效的方法将脚本转换为包?

最佳答案

你永远不应该使用 library()require()在一个包中,因为它们会影响用户的搜索列表,可能会导致用户出错。
例如,dplyrstats包导出一个名为 filter 的函数.如果用户只有 library(stats) ,然后 filter将意味着 stats::filter , 但如果你的包裹叫 library(dplyr) ,用户可能会突然发现 filter意味着 dplyr::filter ,事情就会破裂。
您的包裹有几种选择。您可以通过在 Imports: 中列出来从另一个包中导入函数。 DESCRIPTION 中的字段文件并在 NAMESPACE 中指定导入文件。 (如果您在 roxygen2 源文件中添加适当的注释,.R 包可以自动为您进行这些更改,例如

#' @importFrom jsonlite toJSON unbox
在使用这些导入的函数之前 toJSON()unbox()来自 jsonlite包裹。)
另一种方法是使用 ::符号。然后你仍然可以在 Imports: 中列出一个包领域 DESCRIPTION ,但使用类似的代码
jsonlite::toJSON(...)
每次你想调用它。或者,如果您不想强烈依赖 jsonlite ,你可以把 jsonliteSuggests: ,并将它的任何用途包装在代码中,例如
if (requireNamespace("jsonlite")) {
jsonlite::toJSON(...)
}
那么没有那个包的人仍然可以运行你的函数,但它可能会跳过一些需要 jsonlite 的操作。 .

关于r - 为什么不应该在 R 包中使用 library() 或 require(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64737686/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com