r语言 - require() 和 library() 有什么区别



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

在日常工作中没有多少。

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

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(),除非您实际上将使用它返回的值,例如在某些错误检查循环中,例如由 thierry 给出的值。

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

始终使用 library .切勿使用require

DR:require打破了健壮软件系统的基本规则之一:尽早失败

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

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

这可能会导致微妙的错误结果。使用 library 而不是 require 在此处抛出错误,清楚地表明出了问题。这很好。

这也使调试所有其他故障变得更加困难:如果在脚本开始时require包并在第 500 行使用其导出,则会在第 500 行收到错误消息"找不到对象'foo'",而不是错误"没有名为'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 开发人员同意:

《{knitr}》、《{bookdown}》和许多其他软件包的作者Yihui Xie说:

女士们,先生们,我之前说过:require(( 是加载 R 包的错误方式;改用 library((

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

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

如果要在必要时安装软件包,则可以使用 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")
    
  • 您可以将require()library()包装在suppressPackageStartupMessages()中,以抑制包启动消息,如果需要,还可以使用参数require(..., quietly=T, warn.conflicts=F)来保持安装安静。

?library

你会看到:

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

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

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

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

最新更新