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

require()library()什么区别?

日常工作中没有太多。

但是,根据这两个函数的文档(通过在函数名称前面加一个?并按回车来访问),在函数内部使用require ,因为它会输出一个警告,如果没有find包,则继续;而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()如果你想要安装软件包,当且仅当必要的时候,比如:

 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()包装在suppressPackageStartupMessages()中,以便抑制包的启动信息,并且如果需要的话,还可以使用参数require(..., quietly=T, warn.conflicts=F)安静。

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

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

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

 ?library 

你会看到:

library(package)require(package)都加载包名称package并把它放在search列表中。 require被devise用于其他function内部; 它返回FALSE并给出一个警告(而不是像library()默认那样的错误),如果包不存在的话。 这两个函数检查并更新当前加载的包列表,不重新加载已加载的包。 (如果要重新加载这样的包,请首先调用detach(unload = TRUE)unloadNamespace 。)如果要加载包而不将其放在search列表中,请使用requireNamespace

我最初的理论不同之处在于, library加载的软件包是否已经加载,也就是说,它可能会重新加载一个已经加载的软件包,而只require检查它是否被加载,或者加载它,如果不是的话在依赖于某个包的函数中)。 但是,文档驳斥了这一点,并明确指出这两个函数都不会重载一个已经加载的包。

这似乎是已经加载的包上的差异。 虽然确实需求和库不加载包。 图书馆在检查和退出之前做了很多其他的事情。

我build议从运行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 

require()加载所有附加的包