我开始尝试找出library()
和require()
之间的区别,并且在这里找到了一篇很好的说明:What is the difference between require() and library()?
在这篇文章中,他们讨论了如何在函数中使用require()
并在脚本顶部使用library()
。这提出了我的问题:在函数中而不是在脚本顶部加载包的目的是什么?这样做有什么好处?
谢谢!
答案 0 :(得分:0)
要进一步详细说明@alistaire的评论,我认为重要的部分是在可能的地方使用::
表示法(很抱歉,答案是肯定的,但是我想使用一些不适用于一条评论)。总体思路是保持NAMESPACE
尽可能整洁,并仅在需要时调用特定功能,即暂时使用它们,并且不要在当前会话中永久加载它们。当然,它们仍然需要安装在系统上才能加载它们。临时加载可避免冲突或其他副作用,例如,当两个不同的程序包对功能执行不同操作的功能使用相同的名称时。
为说明有关名称空间的问题,您可以在下面的代码中检查,您将需要安装库stringi
,我仅作为示例。我希望这会有所帮助。
# load a library and check if its loaded
library(stringi)
names(sessionInfo()$otherPkgs)
# [1] "stringi"
# detach it
detach("package:stringi", unload = TRUE)
names(sessionInfo()$otherPkgs)
# NULL
# use library with :: notation, e.g., within function
my_fun <- function(x) {
stringi::stri_replace_all_fixed(x, "a", "b")
}
my_fun("aaa")
# [1] "bbb"
# check if library is loaded
names(sessionInfo()$otherPkgs)
# NULL -> it is not loaded, hence, the namespace is kept clean