require()
和library()
有什么区别?
在日常工作中没有多少。
但是,根据这两个函数的文档(通过在函数名称前放置?
并按回车键访问(,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")
}
}
除了已经给出的好建议之外,我还要补充一点:
最好避免使用require()
,除非您实际上将使用它返回的值,例如在某些错误检查循环中,例如由 thierry 给出的值。
在大多数其他情况下,最好使用 library()
,因为如果包不可用,这将在包加载时给出错误消息。 如果包不存在,require()
将失败而不会出错。这是确定是否需要安装软件包的最佳时机(或者甚至可能不存在,因为它拼写错误(。 尽早和相关时间获取错误反馈将避免可能的头痛,因为跟踪为什么后面的代码在尝试使用库例程时失败
始终使用 library
.切勿使用require
。
DR:require
打破了健壮软件系统的基本规则之一:尽早失败。
简而言之,这是因为,当使用 require
时,您的代码可能会产生不同的错误结果,而不会发出错误的信号。这是罕见的,但不是假设的!考虑以下代码,它根据是否可以加载 {dplyr} 产生不同的结果:
require(dplyr)
x = data.frame(y = seq(100))
y = 1
filter(x, y == 1)
这可能会导致微妙的错误结果。使用 library
而不是 require
在此处抛出错误,清楚地表明出了问题。这很好。
这也使调试所有其他故障变得更加困难:如果在脚本开始时require
包并在第 500 行使用其导出,则会在第 500 行收到错误消息"找不到对象'foo'",而不是错误"没有名为'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}》和许多其他软件包的作者Yihui Xie说:
女士们,先生们,我之前说过:require(( 是加载 R 包的错误方式;改用 library((
Hadley Wickham,比其他任何人都更受欢迎的R包的作者,说
在数据分析脚本中使用
library(x)
。[...]你永远不需要使用require()
(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")
您可以将
require()
和library()
包装在suppressPackageStartupMessages()
中,以抑制包启动消息,如果需要,还可以使用参数require(..., quietly=T, warn.conflicts=F)
来保持安装安静。
?library
你会看到:
library(package)
和require(package)
都加载带有名称的包package
并将其放在搜索列表中。require
专为使用 而设计 在其他功能内部;它返回FALSE
并给出警告(而不是 而不是错误,因为library()
默认情况下会这样做(如果包没有 存在。这两个函数都会检查并更新当前加载的列表 包,不要重新加载已加载的包。(如果你 想要重新加载这样的包,请拨打detach(unload = TRUE)
或 首先unloadNamespace
。如果您想加载包而不放置 在搜索列表中,使用requireNamespace
.
我关于差异的最初理论是,无论包是否已加载,library
都会加载包,即它可能会重新加载已经加载的包,而require
只是检查它是否已加载,或者如果未加载(因此在依赖于某个包的函数中使用(。但是,该文档反驳了这一点,并明确指出这两个函数都不会重新加载已加载的包。
这似乎是已经加载的包的区别。虽然确实需要和库都不会加载包。库在检查和退出之前会做很多其他事情。
无论如何,我建议从运行 2mil 次的函数的开头删除"require",但如果出于某种原因我需要保留它。 从技术上讲,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