require()和library()有什么区别?
require()
和library()
什么区别?
#1楼
我关于差异的初步理论是, library
加载包是否已经加载,即它可能重新加载已经加载的包,而只require
检查它是否已加载,或者如果不加载则加载它(因此使用在依赖某个包的函数中)。 但是,文档驳斥了这一点,并明确指出这两个函数都不会重新加载已加载的包。
#2楼
?library
你会看到:
library(package)
和require(package)
都使用namepackage
加载package
并将其放在搜索列表中。require
设计用于其他功能; 如果包不存在,它返回FALSE
并发出警告(而不是像library()
默认执行的错误library()
。 这两个函数都检查并更新当前加载的包列表,并且不重新加载已加载的包。 (如果要重新加载此类包,unloadNamespace
调用detach(unload = TRUE)
或unloadNamespace
。)如果要加载包而不将其放在搜索列表中,请使用requireNamespace
。
#3楼
如果要在必要时安装软件包,可以使用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()
来抑制包启动消息,并且如果需要保持安装,还可以使用参数require(..., quietly=T, warn.conflicts=F)
安静。
#4楼
除了已经给出的好建议之外,我还要补充一下:
最好避免使用require()
除非你实际上将使用它返回的值,例如在thierry给出的一些错误检查循环中。
在大多数其他情况下,最好使用library()
,因为如果程序包不可用,这将在程序包加载时给出错误消息。 如果包不存在, require()
将失败而没有错误。 这是确定是否需要安装软件包的最佳时间(或者甚至可能因为拼写错误而不存在)。 在相关时间尽早获得错误反馈可以避免在尝试使用库例程时追踪以后代码失败的原因时可能出现的问题
#5楼
这似乎是已经加载的包的区别。 虽然确实需要和库都不加载包。 图书馆在检查和退出之前会做很多其他事情。
我建议从运行2mil次的函数的开头删除“require”,但是如果由于某种原因我需要保留它。 要求在技术上是一个更快的检查。
microbenchmark(req = require(microbenchmark), lib = library(microbenchmark),times = 100000)
Unit: microsecondsexpr min lq mean median uq max nevalreq 3.676 5.181 6.596968 5.655 6.177 9456.006 1e+05lib 17.192 19.887 27.302907 20.852 22.490 255665.881 1e+05
#6楼
总是使用library
。 从不1使用require
。
( 1几乎没有。 也许 。)
简而言之,这是因为,当使用require
,您的代码可能会产生不同的错误结果, 而不会发出错误信号 。 这很少见,但不是假设! 考虑这段代码,根据是否可以加载{dplyr},会产生不同的结果 :
require(dplyr)x = data.frame(y = seq(100))
y = 1
filter(x, y == 1)
这可能导致巧妙的错误结果。 使用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
}
有经验的R开发商同意:
艺辉谢的{} knitr笔者{} bookdown和许多其他的包说 :
女士们,先生们,我之前说过:require()是加载R包的错误方法; 使用library()代替
Hadley Wickham是比其他任何人都更受欢迎的R套餐的作者
在数据分析脚本中使用
library(x)
。 [...]你永远不需要使用require()
(requireNamespace()
几乎总是更好)
#7楼
日常工作中没有多少人。
但是,根据两个函数的文档(通过在函数名称之前输入?
并按下enter键访问),在函数内部使用require
,因为它输出警告并在未找到包时继续,而library
将抛出错误。
#8楼
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()和library()有什么区别?相关推荐
- include,require,include_once,require_once区别
include和require的作用是相同的,唯一的不同是PHP在遇到include命令的时候必须重新解释一次.如果在同一个PHP页面中出现10此include命令,它便会重新解释10次.不过当PHP ...
- require include php5中最新区别,百度上好多错的。
二者报错机制不同,include是warning 继续执行程序,require会报致命错误,中断程序运行. 前者有返回值,后者则没有. 注意了,php5里有一个区别没了,之前说的是require是无条 ...
- eclipse 导出可运行jar包时三种Library handling的区别
我们在eclipse中打包一个可运行的jar包的时候,Library handing中的选项有下面三种: 那么eclipse中Runnable JAR file的这三种打包方式有什么区别呢? 第一个E ...
- PHP中include、include_once、require、require_once四者区别
require的使用方法如 require("MyRequireFile.php"); .这个函式通常放在 PHP 程式的最前面,PHP 程式在执行前,就会先读 ...
- require(),include(),require_once()和include_once()区别
我把这两个语句放在一起介绍,读者可以比较学习. 1.require()语句 require()语句用于指定的文件代替语句本身,就象C语言中的include()语句一样.如果php配置文件php.in ...
- IOS沙盒中的Documents、Library、tmp区别
1.Documents: 用户生成的文件.其他数据及其他程序不能重新创建的文件,iTunes备份和恢复的时候会包括此目录. 2.Library/Caches: 可以重新下载或者重新生成的数据,数据库缓 ...
- Gulp,grunt,seajs/require和browserify/webpack的区别
Gulp / Grunt 是构建工具,可以配合各种平台上的插件做js压缩,各种css编译,页面自动刷新,检查语法等,替代手工实现自动化开发 seajs/require和browserify/webpa ...
- Ruby中require,load,和include的区别
很简单 1.requre,load用于文件,如.rb等等结尾的文件. 2.include则用于包含一个文件(.rb等结尾的文件)中的模块. 3.requre一般情况下用于加载库文件,而load则用于加 ...
- WCF学习笔记(一):WCF Service Application和WCF Service Library的区别
近来在学习WCF,遇到了不少问题,有的让我焦头烂额,不过解决问题的过程就是学习的过程,收获也不少. 昨天有个问题开始困扰我--WCF Service Application和WCF Service L ...
最新文章
- 人月神话贯彻执行_上古神话知识梳理,精华帖
- video 属性和事件用法大全
- 融资2.5亿的国产浏览器,被曝只是打包chrome
- linux raid livecd,liveCD,liveDVD,binDVD版本区别Centos
- com.alibaba.dubbo.rpc.RpcException: Since you are
- ssh远程连接虚拟机
- service mesh:istio全
- 如何解读羊毛出在了猪身上的保理业务?
- 正确插入目录并且自由更新
- GDS文件如何打开?
- 《英语语法新思维初级教程》学习笔记(四)数量限定词和个体限定词
- [Vue warn] Extraneous non-emits event listeners (createSuccess) were passed to component but could
- php订单管理系统(源码+数据库+截图)
- 括号匹配,实现简单计算器(加减乘除,小括号)
- C#使用ffmpeg抽帧压缩mp4
- SVN_Windows安装Subversion(svn 命令行工具)教程
- 批量修改文件名为上级目录名字
- 【Vic的小课堂】Unity游戏功能(2)—第一人称镜头
- matlab pxi采集卡,贵州供应阿尔泰PXI测控系统PXI采集卡PXI9606多功能卡
- Swift 现可使用 Checkmarx 检查代码出错