提问



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

最佳参考


日常工作中没有多少人。


但是,根据两个函数的文档(通过在函数名称之前输入?并按下输入来访问),require用于函数内部,因为它输出警告并在包不是时继续发现,而library会抛出错误。

其它参考1


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")
    }
}

其它参考2


如果要在必要时安装软件包,可以使用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)
    }
}


专业提示:



  • 在脚本中使用时,可以通过指定install.packages()repos参数来避免对话框屏幕,例如


    install.packages(package, repos="http://cran.us.r-project.org")
    

  • 您可以在suppressPackageStartupMessages()中包含require()library()来抑制包启动消息,并在需要时使用参数require(..., quietly=T, warn.conflicts=F)来保持安装的安静。


其它参考3


除了已经给出的好建议之外,我还要补充一点:


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


在大多数其他情况下,最好使用library(),因为如果包不可用,这将在包加载时给出错误消息。如果没有包裹,require()将会失败而没有错误。这是确定是否需要安装软件包的最佳时间(或者可能因为拼写错误而不存在)。尽早获取错误反馈并在相关时间避免可能的问题,以便追踪以后代码失败的原因当它试图使用库例程时

其它参考4


?library


你会看到:



  library(package)require(package)都用名称加载包
  package并将其放在搜索列表中。 require是专为使用而设计的
  在其他功能内;它返回FALSE并发出警告(相反
  而不是library()默认情况下的错误)如果包没有
  存在。这两个函数都检查并更新当前加载的列表
  包,不要重新加载已加载的包。 (如果你
  想要重新加载这样的包,请detach(unload = TRUE)
  unloadNamespace首先。)如果你想加载包而不放
  它在搜索列表中,使用requireNamespace


其它参考5


我关于差异的初步理论是library加载包是否已经加载,即它可能重新加载已加载的包,而require只检查它是否已加载,或者加载它它不是(因此在依赖某个包的函数中的使用)。然而,文档驳斥了这一点,并明确指出这两个函数都不会重新加载已经加载的包。

其它参考6


这似乎是已经加载的包的差异。
虽然require和library都没有加载包。图书馆在检查和退出之前会做很多其他事情。


我建议从运行2mil次的函数的开头删除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

其它参考7


始终使用library。从不 1 使用require



( 1 几乎从不。也许。)


简而言之,这是因为,当使用require时,您的代码可能会产生不同的,错误的结果,而不会发出错误信号。这很少见,但不是假设!请考虑此代码,会产生不同的结果,具体取决于是否可以加载{dplyr}:


require(dplyr)

x = data.frame(y = seq(100))
y = 1
filter(x, y == 1)


这可能导致微妙的错误结果。使用library代替require会在此处抛出错误,清楚地表明出现了问题。这很好。[56]


它还使得调试所有其他故障变得更加困难:如果你require在脚本开头的一个包并在第500行使用它的导出,你将得到一个错误消息找不到对象'foo' 500,而不是错误没有名为'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}和许多其他软件包的作者说: [58]



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



Hadley Wickham是比其他任何人更受欢迎的R套餐的作者,他说



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


其它参考8


require()加载所有其他包