ric*_*roe 345
日常工作中没有多少人.
但是,根据两个函数的文档(通过?
在函数名称之前输入并按下enter键访问),require
在函数内部使用,因为它输出警告并在未找到包时继续,但library
会抛出错误.
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)
艺辉谢的{} 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
.
我关于差异的初步理论是library
加载包是否已经加载,即它可能重新加载已经加载的包,而require
只检查它是否已加载,或者加载它(如果不加载)(因此在函数中使用)依赖某个包裹).但是,文档驳斥了这一点,并明确指出这两个函数都不会重新加载已经加载的包.
这似乎是已经加载的包的区别。虽然 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)