Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
require()和library()之间有什么区别?_R_Package_R Faq - Fatal编程技术网

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

require()和library()之间有什么区别?,r,package,r-faq,R,Package,R Faq,require()和library()之间有什么区别?在日常工作中没有多少区别 但是,根据这两个函数的文档(通过在函数名称前放置一个?并点击enter键来访问),require在函数内部使用,因为它输出一个警告,如果找不到包就会继续,而库将抛出一个错误。require()的另一个好处是默认情况下,它返回一个逻辑值TRUE如果已加载包,则为FALSE如果未加载包 > test <- library("abc") Error in library("abc") : there is no

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

在日常工作中没有多少区别


但是,根据这两个函数的文档(通过在函数名称前放置一个
并点击enter键来访问),
require
在函数内部使用,因为它输出一个警告,如果找不到包就会继续,而
将抛出一个错误。

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

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

?library
你会看到:

library(package)
require(package)
都使用名称加载包
打包
并将其放在搜索列表中<代码>要求专为使用而设计 内部其他职能;它返回
FALSE
,并给出警告(而不是 如果程序包未执行,则会出现错误,如
library()
默认情况下执行的错误) 存在。这两个函数都检查并更新当前加载的 包,不要重新加载已加载的包。(如果你 要重新加载这样的包,请调用
detach(unload=TRUE)
unloadNamespace
首先。)如果要加载包而不放置 在搜索列表中,使用
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)
    }
}
  • 您可以将
    require()
    library()
    包装在
    suppressPackageStartupMessages()
    中,以抑制程序包启动消息,如果需要,还可以使用参数
    require(…,悄悄地=T,警告。冲突=F)
    ,使安装保持安静


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

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


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

      这里似乎是已加载包的区别。 确实,require和library都不加载包。图书馆在检查和退出之前会做很多其他的事情

      我建议从运行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
      
      始终使用
      。切勿使用
      require
      。 tl;dr:
      require
      打破了健壮软件系统的一个基本规则:

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

      require(dplyr)
      
      x = data.frame(y = seq(100))
      y = 1
      filter(x, y == 1)
      
      这可能导致微妙的错误结果。使用
      library
      而不是
      require
      会在此处抛出错误,明确表示出了问题

      这也使得调试所有其他故障变得更加困难:如果在脚本开始时
      需要
      一个包,并在第500行中使用其导出,则在第500行中会出现错误消息“object'foo'notfound”,而不是错误“没有名为'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}和许多其他软件包的作者:

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

      他说,他是最受欢迎的R软件包的作者

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


      添加@Yihui博客帖子的链接,除非他想发布一个版本的帖子作为答案。如果我想在加载包后返回一个逻辑值,我通常使用require。总结@Yihui的博文:“女士们,先生们,我以前说过:require()是加载R包的错误方法;使用library()而不是
      require(dplyr)
      
      x = data.frame(y = seq(100))
      y = 1
      filter(x, y == 1)
      
      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
      }