require()
和之间有什么区别library()
?
library()
立即大声地失败,并带有相关的错误消息(如果未安装软件包或无法加载该软件包),而require()
不会引发错误,则仅返回布尔值FALSE,该值将被丢弃,并导致代码稍后Error: object “bar” not found
(在)第175行上
require()
和之间有什么区别library()
?
library()
立即大声地失败,并带有相关的错误消息(如果未安装软件包或无法加载该软件包),而require()
不会引发错误,则仅返回布尔值FALSE,该值将被丢弃,并导致代码稍后Error: object “bar” not found
(在)第175行上
Answers:
日常工作很少。
但是,根据这两个函数的文档(通过?
在函数名称前加上a 并按Enter进行访问),该函数require
在函数内部使用,因为它会输出警告并在未找到包的情况下继续,但library
会引发错误。
require
是,它使我无法将package称为libraries
,这是使R-cognoscenti泛滥的一种做法。该library
是目录包的位置坐下。
require
,除非您检查返回值(在这种情况下,通常会有更好的选择,例如loadNamespace
)。
的另一个好处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()
如果需要并且仅在必要时安装软件包,可以使用,例如:
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
。切勿1个使用require
。(1几乎从未。也许。)
简而言之,这是因为在使用时require
,您的代码可能会产生不同的错误结果,而不会发出错误信号。这是罕见的,但不是假设!考虑以下代码,根据是否可以加载{dplyr} ,它会产生不同的结果:
require(dplyr)
x = data.frame(y = seq(100))
y = 1
filter(x, y == 1)
这可能会导致错误的结果。在此处使用library
而不是require
引发错误,可以清楚地表明出了问题。这很好。
这也使调试所有其他失败更加困难:如果require
在脚本开始时打包并在第500行中使用其导出,则在第500行中会收到一条错误消息“找不到对象'foo'”,而不是错误“没有名为'bla'的软件包”。
如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
}
艺辉谢的{} knitr笔者{} bookdown和许多其他的包说:
女士们,先生们,我之前已经说过:require()是加载R程序包的错误方法。使用library()代替
比其他任何人都受欢迎的R包的作者Hadley Wickham说
使用
library(x)
数据分析脚本。[…]您永远不需要使用require()
(requireNamespace()
几乎总是更好)
class::function
使用语法调用所有函数,否则请library()
避免使用该语法。
我最初关于差异的理论是library
无论是否已加载都加载软件包,即,它可能会重新加载已经加载的软件包,而require
只是检查它是否已加载,或者是否加载(因此在函数中的使用)依赖特定的软件包)。该文档对此进行了反驳,但是明确指出这两个函数都不会重新加载已经加载的程序包。
这似乎是已经加载的程序包的区别。确实,require和library都不会加载程序包。库在检查并退出之前会做很多其他事情。
无论如何,我建议从运行2百万次的函数开头删除“ 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
library
(R附带的两个函数都是一团糟)。
loadNamespace
,它会加载一个包并返回其名称空间,而不附加它。