require()
和 和有什么不一样library()
?
8 回答
日常工作中没有太多的东西。
但是,根据这两个函数的文档(通过?
在函数名称前加上 a 并按 Enter 访问),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()
如果包不存在,只会失败而不会出现错误。这是确定是否需要安装软件包(或者甚至可能不存在,因为它拼写错误)的最佳时机。尽早并在相关时间获得错误反馈将避免在尝试使用库例程时追踪后来的代码失败的原因
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)
}
}
专业提示:
在脚本内部使用时,可以通过指定 的
repos
参数来避免出现对话框画面install.packages()
,例如install.packages(package, repos="http://cran.us.r-project.org")
您可以包装
require()
并隐藏包启动消息,并在需要时使用参数library()
来保持安装安静。suppressPackageStartupMessages()
require(..., quietly=T, warn.conflicts=F)
始终使用library
. 永远不要使用require
.
tl; dr:require
打破了健壮软件系统的基本规则之一:尽早失败。
简而言之,这是因为在使用 时require
,您的代码可能会产生不同的错误结果,而不会发出错误信号。这是罕见的,但不是假设的!考虑这段代码,它根据是否可以加载 {dplyr}产生不同的结果:
require(dplyr)
x = data.frame(y = seq(100))
y = 1
filter(x, y == 1)
这可能会导致微妙的错误结果。使用library
而不是在require
这里抛出错误,清楚地表明有问题。这很好。
它还使调试所有其他故障变得更加困难:如果您require
在脚本开头的一个包并在第 500 行使用它的导出,您将在第 500 行收到错误消息“object 'foo' not found”,而不是错误“没有名为'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()
几乎总是更好)
?library
你会看到:
library(package)
并且require(package)
都加载带有名称的包package
并将其放在搜索列表中。require
设计用于其他功能;如果包不存在,它会返回FALSE
并给出警告(而不是默认情况下的错误)。library()
这两个函数都会检查和更新当前加载的包列表,并且不会重新加载已经加载的包。(如果您想重新加载这样的包,请先调用detach(unload = TRUE)
orunloadNamespace
。)如果您想加载一个包而不将其放在搜索列表中,请使用requireNamespace
.
我关于差异的最初理论是library
加载包是否已经加载,即它可能重新加载一个已经加载的包,同时require
只是检查它是否已加载,或者如果没有加载它(因此在函数中使用依赖于某个包)。然而,文档反驳了这一点,并明确指出这两个函数都不会重新加载已经加载的包。
这似乎是已加载包的差异。确实,require 和 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