始终使用library。永远不要使用require。
tl;dr:require 打破了稳健软件系统的基本规则之一:fail early。
简而言之,这是因为在使用 require 时,您的代码可能会产生不同的错误结果,不会发出错误信号。这是罕见的,但不是假设的!考虑一下这段代码,它会产生不同的结果,具体取决于是否可以加载 {dplyr}:
require(dplyr)
x = data.frame(y = seq(100))
y = 1
filter(x, y == 1)
这可能会导致微妙的错误结果。使用library 而不是require 会在此处引发错误,清楚地表明有问题。 This is good.
它还使调试所有其他故障变得更加困难:如果您在脚本开头require 一个包并在第 500 行使用它的导出,您将收到一条错误消息“object 'foo' not found”第 500 行,而不是错误“没有名为 '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 开发人员同意:
Yihui Xie,{knitr}、{bookdown} 和许多其他软件包的作者says:
女士们先生们,我之前说过:require() 是加载 R 包的错误方法;改用 library()
Hadley Wickham,比其他任何人都更受欢迎的 R 包的作者,说
在数据分析脚本中使用library(x)。 […]
你永远不需要使用require()(requireNamespace() 几乎总是更好)