require()
和 library()
有什么区别?
在日常工作中,这两者没什么区别。
但是根据这两个函数的文档说明(通过在函数名前加上?
并按回车键访问),require
用于函数内部,因为它会输出警告并继续运行,如果找不到包,而library
则会抛出错误。
require
的另一个原因是为了避免把包称作“库”,这样做会让 R 精英们非常恼火。而“库”实际上是指存放包的目录位置。 - IRTFMloadNamespace
),否则不要使用“require”。 - Konrad Rudolphrequire()
的另一个好处是它默认返回一个逻辑值。如果包已经加载,返回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
简而言之,这是因为在使用require
时,你的代码可能会产生不同的错误结果,而不会发出错误信号。这是罕见但并非假设!考虑以下代码,它会根据是否可以加载{dplyr}来产生不同的结果:
tl;dr:require
违反了健壮软件系统的基本规则之一:尽早失败。
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
}
Yihui Xie, {knitr},{bookdown}和许多其他软件包的作者表示:
女士们先生们,我曾经说过:require()是加载R软件包的错误方式;请使用library()。
Hadley Wickham, 比任何其他人都更流行的R软件包的作者,表示
在数据分析脚本中使用
library(x)
。[...] 你永远不需要使用require()
(几乎总是使用requireNamespace()
更好)
class::function
语法调用所有函数,否则请使用 library()
来避免这种情况。 - Ghost如果您只想在必要时安装包,可以使用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)
}
}
专业技巧:
When used inside the script, you can avoid a dialog screen by specifying the repos
parameter of install.packages()
, such as
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.
?library
然后你会看到:
library(package)
和require(package)
都会加载名为package
的包并将其放置在搜索列表中。require
是设计用于其他函数内部使用; 如果该包不存在,它会返回FALSE
并发出警告(而不像默认情况下的library()
那样抛出错误)。这两个函数都会检查并更新当前已加载的包列表,并且不会重新加载已经加载过的包。 (如果您想重新加载此类软件包,请先调用detach(unload = TRUE)
或unloadNamespace
。)如果您想要加载一个包而不将其放入搜索列表中,请使用requireNamespace
。
我最初的理论是,library
无论其是否已加载,都会加载软件包,即它可能重新加载已经加载的软件包,而require
仅检查是否已加载该软件包,如果没有加载,就会加载它(因此在依赖于特定软件包的函数中使用)。 然而,文档驳斥了这一点,并明确表示任何一个函数都不会重新加载已经加载的软件包。
这里似乎存在一个已加载包的差异。虽然require和library都不会加载该包,但是library在检查并退出之前会执行很多其他操作。
我建议在运行200万次的函数开头删除"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
loadNamespace
,它加载软件包并返回其名称空间,而不会将其附加。 - Konrad Rudolph
library()
会立即失败,输出相关的错误信息(如果包未安装或无法加载),这样可以尽早地发现问题,而require()
不会引发任何错误,只是静默地返回布尔值 FALSE 被抛弃,导致代码在稍后更加难以理解地失败,并出现“Error: object “bar” not found” (比如在第 175 行)。 - smcirequire
的严重警告的答案。) - Konrad Rudolph