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

Mar*_*rco 524 packages r

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

ric*_*roe 345

日常工作中没有多少人.

但是,根据两个函数的文档(通过?在函数名称之前输入并按下enter键访问),require在函数内部使用,因为它输出警告并在未找到包时继续,但library会抛出错误.

  • 我使用`require`的另一个原因是它阻止我将包称为`libraries`,这种做法将R-cognoscenti推向了墙上.`library`是包所在的目录位置. (45认同)
  • 他们有非常相关的差异.不要使用`require`,**除非**检查返回值(在这种情况下通常有更好的替代方法,例如`loadNamespace`). (22认同)
  • 只要你没有在函数内部加载包,它就没有任何区别.我使用require加载了所有的包,并且在看到你的问题之后我才知道它的区别是什么. (6认同)
  • #richiemorrisroe:谢谢。这是否意味着如果我在 R 代码的最开始加载我需要的包,我选择哪个都无关紧要? (2认同)

Thi*_*rry 251

另一个好处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
Run Code Online (Sandbox Code Playgroud)

所以你可以使用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")
    }
}
Run Code Online (Sandbox Code Playgroud)


Dan*_*ing 64

require()如果要在必要时安装软件包,可以使用,例如:

if (!require(package, character.only=T, quietly=T)) {
    install.packages(package)
    library(package, character.only=T)
}
Run Code Online (Sandbox Code Playgroud)

对于您可以使用的多个包

for (package in c('<package1>', '<package2>')) {
    if (!require(package, character.only=T, quietly=T)) {
        install.packages(package)
        library(package, character.only=T)
    }
}
Run Code Online (Sandbox Code Playgroud)

专业提示:

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

    install.packages(package, repos="http://cran.us.r-project.org")
    
    Run Code Online (Sandbox Code Playgroud)
  • 你可以用require()library()suppressPackageStartupMessages(),好了,抑制包装启动消息,并使用这些参数require(..., quietly=T, warn.conflicts=F),如果需要保持安静安装.


dww*_*dww 64

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

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

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


Kon*_*lph 41

一直用library.切勿1个使用require.

(1几乎没有.也许.)

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

require(dplyr)

x = data.frame(y = seq(100))
y = 1
filter(x, y == 1)
Run Code Online (Sandbox Code Playgroud)

这可能导致巧妙的错误结果.使用library而不是在require这里抛出错误,清楚地表明出现了问题.这很好.

它还使调试所有其他故障变得更加困难:如果你require在脚本的开头有一个软件包并在第500行使用它的导出,你将在第500行得到一条错误消息"object'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
}
Run Code Online (Sandbox Code Playgroud)

有经验的R开发商同意:

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

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

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

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


dws*_*stu 19

?library
Run Code Online (Sandbox Code Playgroud)

你会看到:

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


dsb*_*dsb 9

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

  • 这很有意思,但这不是问题的答案......? (18认同)

Sha*_*ape 5

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

无论如何,我建议从运行 200 万次的函数的开头删除“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
Run Code Online (Sandbox Code Playgroud)