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

时间:2011-04-08 13:09:14

标签: r packages

require()library()之间的区别是什么?

8 个答案:

答案 0 :(得分:328)

日常工作中并不多。

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

答案 1 :(得分:241)

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 :(得分:62)

如果您只想在必要时安装软件包,可以使用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的{​​{1}}参数来避免出现对话框,例如

    install.packages()
  • 您可以将install.packages(package, repos="http://cran.us.r-project.org") require()包裹在library()中,以抑制包启动消息,并在需要时使用参数suppressPackageStartupMessages()来保留安装安静。

答案 3 :(得分:56)

除了已经给出的好建议外,我还要加上:

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

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

答案 4 :(得分:30)

始终使用library。永远不要 1 使用require

1 几乎从不。也许。)

简而言之,这是因为在使用require时,您的代码可能会产生不同的错误结果,而没有发出错误信号。这是罕见的,但不是假设!考虑下面的代码,根据是否可以加载{dplyr},该代码产生不同的结果

require(dplyr)

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

这可能会导致错误的结果。使用library代替require会在此处引发错误,清楚地表明出了问题。 This is good

这也使所有其他故障的调试变得更加困难:如果在脚本开始时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开发人员同意:

Yihui Xie,{knitr},{bookdown}和许多其他软件包says的作者:

  

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

Hadley Wickham是最受欢迎的R包的作者,他说

  

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

答案 5 :(得分:19)

?library

你会看到:

  

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

答案 6 :(得分:6)

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

答案 7 :(得分:3)

这似乎是已经加载的包的区别。 虽然确实需要和库都不加载包。图书馆在检查和退出之前会做很多其他事情。

我建议删除&#34;要求&#34;从一个运行2mil次的函数开始,但是如果由于某种原因我需要保留它。从技术上讲,要求是更快的检查。

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