require()和library()有什么区别?


565

require()和之间有什么区别library()



7
除非他想发布其版本作为答案,否则请在@Yihui的博客文章中添加链接。yihui.name/zh/2014/07/library-vs-require
MichaelChirico

4
总结@Yihui的博客文章:“女士们,先生们,我之前已经说过:require()是加载R包的错误方法;请使用library()代替”
De Novo

1
@DanHall ...因为library()立即大声地失败,并带有相关的错误消息(如果未安装软件包或无法加载该软件包),而require()不会引发错误,则仅返回布尔值FALSE,该值将被丢弃,并导致代码稍后Error: object “bar” not found(在)第175行上
加密失败。– smci

1
@KonradRudolph:完成!感谢您的反馈意见。
马可(Marco)

Answers:


85

除了已经给出的好的建议之外,我还要添加以下内容:

require() 除非您实际上将使用它返回的值,否则最好避免使用它,例如在诸如thierry给出的某些错误检查循环中。

在大多数其他情况下,最好使用library(),因为如果软件包不可用,这会在软件包加载时给出错误消息。require()如果该软件包不存在,将只会失败而不会出现错误。这是确定是否需要安装软件包的最佳时机(或者甚至因为拼写错误而根本不存在)。尽早在相关时间获取错误反馈,可以避免在尝试使用库例程时跟踪后来的代码为何失败的麻烦


356

日常工作很少。

但是,根据这两个函数的文档(通过?在函数名称前加上a 并按Enter进行访问),该函数require在函数内部使用,因为它会输出警告并在未找到包的情况下继续,但library会引发错误。


1
#richiemorrisroe:谢谢。这是否意味着如果我在R代码的开头加载了所需的包,那么选择哪一个包就没关系了?
马可(Marco)

6
只要您没有在函数内加载程序包,就没有任何区别。我使用require加载了我的所有软件包,直到看到您的问题后我才阅读帮助,才知道有什么区别。
richiemorrisroe 2011年

45
我使用的另一个原因require是,它使我无法将package称为libraries,这是使R-cognoscenti泛滥的一种做法。该library是目录包的位置坐下。
IRTFM 2011年

22
他们有非常相关的差异。不要使用require除非您检查返回值(在这种情况下,通常会有更好的选择,例如loadNamespace)。
康拉德·鲁道夫2015年

256

的另一个好处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")
    }
}

65

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)在需要时使用参数以保持安装安静。


46

始终使用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
}

经验丰富的R开发人员同意:

艺辉谢的{} knitr笔者{} bookdown和许多其他的包

女士们,先生们,我之前已经说过:require()是加载R程序包的错误方法。使用library()代替

比其他任何人都受欢迎的R包的作者Hadley Wickham

使用library(x)数据分析脚本。[…]您永远不需要使用require()requireNamespace()几乎总是更好)


我要指出的是完全一样的,除非您class::function使用语法调用所有函数,否则请library()避免使用该语法。
幽灵

19
?library

您将看到:

library(package)require(package)使用名称加载程序包 package并将其放在搜索列表中。require设计用于其他功能;如果该软件包不存在,它将返回FALSE并给出警告(而不是library()默认情况下的错误)。这两个功能都会检查并更新当前已加载软件包的列表,并且不会重新加载已加载的软件包。(如果要重新加载这样的程序包,请先致电detach(unload = TRUE)或 致电unloadNamespace。)如果要加载程序包而不将其放在搜索列表中,请使用requireNamespace


9

我最初关于差异的理论是library无论是否已加载都加载软件包,即,它可能会重新加载已经加载的软件包,而require只是检查它是否已加载,或者是否加载(因此在函数中的使用)依赖特定的软件包)。该文档对此进行了反驳,但是明确指出这两个函数都不会重新加载已经加载的程序包。


18
这很有趣,但这并不是问题的答案……?
本·博克


3

这似乎是已经加载的程序包的区别。确实,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附带的两个函数都是一团糟)。
康拉德·鲁道夫

@KonradRudolph很好,如果有人要修复库,也许他们还可以显式启用按版本加载并将附件作为参数选项
Shape

是的,我绝对同意,但是那些会改变语义,而不仅仅是性能。无论如何,不​​幸的是,版本控制永远无法与R中的软件包一起使用。我正在为此的替代产品(真的!)。至于附加,您可以使用loadNamespace,它会加载一个包并返回其名称空间,而不附加它。
康拉德·鲁道夫'18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.