require()和library()的区别是什么?

require()library()之间有什么区别?

163206 次浏览

在日常工作中,“一”并不多。

然而,根据这两个函数的文档(通过在函数名之前输入?并按回车键来访问),require在函数内部使用,因为它输出一个警告并在没有找到包时继续,而library将抛出一个错误。

require()的另一个好处是它默认返回一个逻辑值。如果包已加载,则TRUE,如果未加载,则FALSE

> test <- library("abc")
Error in library("abc") : there is no package called 'abc'
> test
Error: object 'test' not found
> test <- require("abc")
Loading required package: abc
Warning message:
In library(package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE,  :
there is no package called 'abc'
> test
[1] FALSE

所以你可以在下面这样的结构中使用require()。如果你想把你的代码分发到我们的R安装包可能不会被安装,这非常方便。

if(require("lme4")){
print("lme4 is loaded correctly")
} else {
print("trying to install lme4")
install.packages("lme4")
if(require(lme4)){
print("lme4 installed and loaded")
} else {
stop("could not install lme4")
}
}

我最初的理论是,library加载包,不管它是否已经加载,也就是说,它可能会重新加载一个已经加载的包,而require只是检查它是否已经加载,或者如果它没有加载就加载它(因此在依赖于某个包的函数中使用)。然而,文档反驳了这一点,并明确指出这两个函数都不会重新加载已经加载的包。

?library

你会看到:

library(package)require(package)都用name加载包 package并把它放在搜索列表中。require是为使用而设计的 内部其他功能;它返回FALSE并给出一个警告(而不是 而不是像library()这样的默认错误) 存在。这两个函数都检查和更新当前加载的列表 不要重新加载已经加载的包。(如果你 要重新加载这样的包,调用detach(unload = TRUE)或 # EYZ0。)如果你想装载一个包而不放 在搜索列表中,使用requireNamespace.

你可以使用require()如果你想安装包,当且仅当必要时,例如:

if (!require(package, character.only=T, quietly=T)) {
install.packages(package)
library(package, character.only=T)
}

对于多个包,您可以使用

for (package in c('<package1>', '<package2>')) {
if (!require(package, character.only=T, quietly=T)) {
install.packages(package)
library(package, character.only=T)
}
}

专业技巧:

  • 当在脚本中使用时,您可以通过指定install.packages()repos参数来避免对话框屏幕,例如

    install.packages(package, repos="http://cran.us.r-project.org")
    
  • You can wrap require() and library() in suppressPackageStartupMessages() to, well, suppress package startup messages, and also use the parameters require(..., quietly=T, warn.conflicts=F) if needed to keep the installs quiet.

除了已经提出的好建议之外,我还要补充一点:

可能最好避免使用require() 除非,你实际上会使用它返回的值,例如在一些错误检查循环中,如thierry给出的。

在大多数其他情况下,最好使用library(),因为如果包不可用,这将在包加载时给出错误消息。如果包不存在,require()将失败而不会出现错误。这是确定是否需要安装软件包(或者可能因为拼写错误而根本不存在)的最佳时机。尽早在相关时间获得错误反馈,可以避免在后续代码尝试使用库例程时追踪失败原因的麻烦

这里似乎是一个已经加载的包的区别。 虽然require和library都不加载包。在检查和退出之前,库会做很多其他的事情

无论如何,我建议将“require”从运行2mil次的函数的开头删除,但如果出于某种原因,我需要保留它。从技术上讲,Require是一种更快的检查。

microbenchmark(req = require(microbenchmark), lib = library(microbenchmark),times = 100000)
Unit: microseconds
expr    min     lq      mean median     uq        max neval
req  3.676  5.181  6.596968  5.655  6.177   9456.006 1e+05
lib 17.192 19.887 27.302907 20.852 22.490 255665.881 1e+05

始终使用library。不要使用require

require打破了健壮软件系统的基本规则之一:<强> < / >强早期失败

简而言之,这是因为当使用require时,您的代码可能会产生不同的错误结果没有发出错误信号。这很罕见,但不是假设!考虑这段代码,产生不同的结果取决于{dplyr}是否可以加载:

require(dplyr)


x = data.frame(y = seq(100))
y = 1
filter(x, y == 1)

这可能会导致微妙的错误结果。使用library而不是require会在这里抛出一个错误,清楚地表明有什么地方出错了。# EYZ2。

这也使得调试所有其他失败更加困难:如果你在脚本的开头require一个包,并在第500行中使用它的导出,你将在第500行中得到一个错误消息“对象' foo ' not found”,而不是错误“there is no package called ' bla '”。

require唯一可以接受的用例是立即检查它的返回值,正如其他一些答案所示。这是一种相当常见的模式,但即使在这些情况下,更好的做法(建议参见下文)是将存在性检查和包的加载分开。也就是说:在这些情况下使用requireNamespace而不是require

更严格地说,require实际上在内部调用library(如果包还没有被附加——require因此执行冗余检查,因为library 检查包是否已经被加载)。下面是require的简化实现,以说明它的功能:

require = function (package) {
already_attached = paste('package:', package) %in% search()
if (already_attached) return(TRUE)
maybe_error = try(library(package, character.only = TRUE))
success = ! inherits(maybe_error, 'try-error')
if (! success) cat("Failed")
success
}

有经验的R开发人员同意:

易汇谢,作者{knitr}, {bookdown}和许多其他包:

女士们先生们,我之前说过:require()是加载R包的错误方式;请改用library()

哈德利韦翰是最受欢迎的R包的作者,他说

在数据分析脚本中使用library(x)。[…] 你永远不需要使用require() (requireNamespace()几乎总是更好)