Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >R语言tryCatch使用方法:判断Warning和Error

R语言tryCatch使用方法:判断Warning和Error

作者头像
邓飞
发布于 2021-01-27 07:25:00
发布于 2021-01-27 07:25:00
90800
代码可运行
举报
运行总次数:0
代码可运行

1. 出门掉坑里

因为一些情况,需要判断一行命令运行的状态,然后再做出反应,整体来说:

  • 是否出现warning,出现了怎么处理?
  • 是否出现Error,出现了怎么处理?
  • 没有出现怎么处理?

R中判断warning和error状态的函数,我没有找到。一个玩Java的同事说,try.....catch多经典的方法,你怎么不用呢?

❝我知道R中有tryCatch这个函数,但是没有具体用过。我一直把R语言当作科学计算语言,没有当成编程语言,伪程序员的气质从没有用过tryCatch表现出来了。当然,我不会说这是我的问题,我会甩锅,都是R语言的锅,它根本不是编程语言……。 ❞

❝吐槽完毕,我还是要从编程的角度学习R语言,正所谓脑子一堆粪,看什么都是粪说的就是我啊,一直把R语言当做高级计算器,怎么能知道R语言的编程功能呢!。既然已经用到了,那我就研究一下它的用法,然后用个示例,解释一下它的用法,希望对后来者有用。 ❞

2. 梯子怎么用?

tryCatch的整体逻辑:」

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tryCatch({
命令
}, warning = function(w){
# 这里是出现warning状态时,应该怎么做,可以用print打印出来,可以执行其它命令
}, error = function(e){
# 这里时出现Error状态时,应该怎么做,可以用print打印出来,也可以执行其它命令
},finally = {
# 这是运行正常时,应该怎么做,可以用print打印出来,也可以执行其它命令
})

「示意图如下:」

3. 走两步试试?

下面用一个示例,看一下tryCatch是怎么使用的。

首先看一下R中warning的报警信息:

「warning」

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 示例数据
library(data.table)
dd = data.frame(ID = 1:10,y= rnorm(10))
dd

# warning
re1 = dcast(dd,y~.)
re1
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> re1 = dcast(dd,y~.)
Using 'y' as value column. Use 'value.var' to override
Warning message:
In dcast(dd, y ~ .) :
  The dcast generic in data.table has been passed a data.frame and will attempt to redirect to the reshape2::dcast; please note that reshape2 is deprecated, and this redirection is now deprecated as well. Please do this redirection yourself like reshape2::dcast(dd). In the next version, this warning will become an error.

可以看到,代码执行成功了,但是会给出Warning message

然后我们看一下Error的报警信息,假定R中没有aaaaa的对象,你直接打印出来,会报错:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# error
aaaaa
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> # error
> aaaaa
错误: 找不到对象'aaaaa'

那我们用tryCatch走两步看看?

「warning处理代码」

  • 在代码中,写下warning的语句,在warning的条件下,返回2
  • 在代码中,写下error的语句,在error的条件下,返回3
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
re1 = tryCatch({
  dcast(dd,y~.) # warning
  # aaaaa # error

},warning = function(w){
  2
  print("warning")
},error = function(e){
  3
  print("error")
})
re1

「结果如下:」

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> re1 = tryCatch({
+   dcast(dd,y~.) # warning
+   # aaaaa # error
+ 
+ },warning = function(w){
+   print("warning")
+   2
+ 
+ },error = function(e){
+   print("error")
+   3
+ })
[1] "warning"
> re1
[1] 2

可以看到,因为dcast(dd,y~.) # warning返回warning,所以会执行function(w){}的内容,即re1 = 2,同时打印出warning.

「error处理代码」

如果我们执行error的代码,那么他就re1=3,同时打印出error

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
re1 = tryCatch({
  # dcast(dd,y~.) # warning
  aaaaa # error

},warning = function(w){
  print("warning")
  2

},error = function(e){
  print("error")
  3
})
re1

结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> re1 = tryCatch({
+   # dcast(dd,y~.) # warning
+   aaaaa # error
+ 
+ },warning = function(w){
+   print("warning")
+   2
+ 
+ },error = function(e){
+   print("error")
+   3
+ })
[1] "error"
> re1
[1] 3

可以看到,打印出了error的警告,同时,re1赋值为了3

4. 意料之外的判断

我有一个大胆的想法,如果一个程序,既有warning,又有error怎么办?

一般情况下,是不会存在这种情况的,但是如果有,R语言是如何处理的呢?

「看示例:」melt这个函数,运行melt(dd,y~.)会报错,同时,因为这个函数在data.table用法有变化,因此,也会给出warning信息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> # 既有warning,又有error时,以warning为主
> melt(dd,y~.)
Error in match(x, y, 0L) : 'match'需要矢量参数
此外: Warning message:
In melt(dd, y ~ .) :
  The melt generic in data.table has been passed a data.frame and will attempt to redirect to the relevant reshape2 method; please note that reshape2 is deprecated, and this redirection is now deprecated as well. To continue using melt methods from reshape2 while both libraries are attached, e.g. melt.list, you can prepend the namespace like reshape2::melt(dd). In the next version, this warning will become an error.

「这个时候,如果用tryCatch,它会捕捉到warning,而不是error

「代码:」

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
re1 = tryCatch({
  # dcast(dd,y~.) # warning
  # aaaaa # error
  melt(dd,y~.)

},warning = function(w){
  print("warning")
  2

},error = function(e){
  print("error")
  3
})
re1

「运行结果:」

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> re1 = tryCatch({
+   # dcast(dd,y~.) # warning
+   # aaaaa # error
+   melt(dd,y~.)
+ 
+ },warning = function(w){
+   print("warning")
+   2
+ 
+ },error = function(e){
+   print("error")
+   3
+ })
[1] "warning"
> re1
[1] 2

所以呢,要注意上面的情况,有时候warningerror同时存在时,warning的优先级是靠前的。

5. 顺利上岸

上岸过程见3. 走两步试试?

6. 被借鉴的文章

❝http://www.mazamascience.com/WorkingWithData/?p=912 https://sarahpenir.github.io/r/Warning-and-Error-Handling-with-trycatch/ ❞

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 育种数据分析之放飞自我 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
R语言基因组数据分析可能会用到的data.table函数整理
R语言data.table包是自带包data.frame的升级版,用于数据框格式数据的处理,最大的特点快。包括两个方面,一方面是写的快,代码简洁,只要一行命令就可以完成诸多任务,另一方面是处理快,内部处理的步骤进行了程序上的优化,使用多线程,甚至很多函数是使用C写的,大大加快数据运行速度。因此,在对大数据处理上,使用data.table无疑具有极高的效率。这里主要介绍在基因组数据分析中可能会用到的函数。
用户1680321
2022/03/10
3.7K0
R语言基因组数据分析可能会用到的data.table函数整理
左手用R右手Python系列——数据塑型与长宽转换
今天这篇是R语言 with Python系列的第三篇,主要跟大家分享数据处理过程中的数据塑型与长宽转换。 其实这个系列算是我对于之前学习的R语言系列的一个总结,再加上刚好最近入门Python,这样在总结R语言的同时,对比R语言与Pyhton在数据处理中常用解决方案的差异,每一个小节只讲一个小知识点,但是这些知识点都是日常数据处理与清洗过程中非常高频的需求。 不会跟大家啰嗦太多每一个函数的详细参数,只列出那些参数中的必要设定,总体以简单实用为原则。如若需要详细了解每一个函数的内部参数,还是需要自己查阅官方文档
数据小磨坊
2018/04/11
2.8K0
左手用R右手Python系列——数据塑型与长宽转换
【R语言】三种批量做T检验的方法
t检验相信大家应该都不陌生。不管是大学里面的数理与统计,还是研究生阶段的生物统计学,里面都会提到t检验。
生信交流平台
2022/09/21
1.9K0
【R语言】三种批量做T检验的方法
【教你R语言】转换长宽格式表的落地方案
做数据分析以及制作表格的时候,会遇到长宽格式数据之间相互转换的问题,之前介绍了如果在Hive是使用sql语句实现,现介绍一下如何在R语言中实现长宽格式数据相互转换。
1480
2019/05/22
2.1K0
不走寻常路的单细胞表达量矩阵读取
但是我看到了一个比较狡猾的数据集(GSE133283),它官网给出来了的文件如下所示:
生信技能树
2024/03/06
5580
不走寻常路的单细胞表达量矩阵读取
R语言中的排序,集合运算,reshape,以及merge总结
不想排版,心情也不好,但是这个知识点很重要,尤其是学习R语言的朋友,请仔细看~ 一直以来我都是随便看了点R的编程教程,因为我学了一点点C,所以还算有基础,现在基本上简单看看教程就能懂一门语言了,区别只是熟练度而已。R用得比较多,所以还算擅长,但是很多快捷应用的地方,我总是寄希望于到时候再查资料,所以没能用心的记住,这次花了点时间好好整理了一下R里面关于数据操作的重点,我想,以后再碰到类似的数据处理要求,应该很快能解决了把。 首先看看排序: 在R中,和排序相关的函数主要有三个:sort(),rank(),or
生信技能树
2018/03/09
1.5K0
R语言中的排序,集合运算,reshape,以及merge总结
R包reshape2 |轻松实现长、宽数据表格转换
https://seananderson.ca/2013/10/19/reshape/
生信宝典
2019/10/24
12.4K0
R语言学习笔记之——数据处理神器data.table
数据处理在数据分析流程中的地位相信大家都有目共睹,也是每一个数据从业者面临的最为繁重的工作任务。 在实际应用场景下,虽然SQL(SQL类专业的etl语言)是数据处理的首选明星语言,性能佳、效率高、容易培养数据思维,但是SQL没法处理构建全流程的数据任务,之后仍然需要借助其他数据分析工具来对接更为深入的分析任务。 R语言作为专业的统计计算语言,数据处理是其一大特色功能,事实上每一个处理任务在R语言中都有着不止一套解决方案(这通常也是初学者在入门R语言时,感觉内容太多无从下手的原因),当然这些不同方案确实存在
数据小磨坊
2018/04/12
3.8K0
R语言学习笔记之——数据处理神器data.table
【数据分析 R语言实战】学习笔记 第三章 数据预处理 (下)
R中缺失值以NA表示,判断数据是否存在缺失值的函数有两个,最基本的函数是is.na()它可以应用于向量、数据框等多种对象,返回逻辑值。
Ai学习的老章
2019/04/10
2.1K0
【数据分析 R语言实战】学习笔记 第三章 数据预处理 (下)
R语言入门(一)之数据处理
写在前面:公众号又被我搁置好久,闲来无事,写写近期学的R语言吧,主要分为两个部分写,一主要为数据处理,二为ggplot作图。这两个部分将生信分析的绝大多数常用命令都讲到了,作为R语言入门是够用的,但是学海无涯,以此只是作为一个引子,想要进步还是要自己多学多练,举一反三才行。
生信real
2020/08/26
10.4K0
R语言入门(一)之数据处理
R语言dataframe数据转换
df_melt<-reshape2::melt(df,id.vars="x",variable.name="year",value.name="value")
爱学习的小明明
2020/09/14
2.2K0
R语言可以绘制ECharts交互式图表啦!
ECharts是一个基于JavaScript实现的开源可视化库,可以流畅的运行在PC和移动设备上,兼容当前绝大部分浏览器。recharts是开发者根据ECharts2开发的一个R语言接口,它使我们可以用R语言实现ECharts作图。
作图丫
2022/03/29
2K0
R语言可以绘制ECharts交互式图表啦!
文本情感分析:特征提取(TFIDF指标)&随机森林模型实现
作者:Matt 自然语言处理实习生 http://blog.csdn.net/sinat__26917383/article/details/51302425 笔者寄语:本文大多内容来自未出版的《数据挖掘之道:基于R的实战之旅》的情感分析章节。本书中总结情感分析算法主要分为两种:词典型+监督算法型。 监督算法型主要分别以下几个步骤: 构建训练+测试集+特征提取(TFIDF指标)+算法模型+K层交叉验证。 基于监督算法的情感分析存在着以下几个问题: (1)准确率而言,基于算法的方法还有待提高,而目前的算
机器学习AI算法工程
2018/03/13
9.4K0
文本情感分析:特征提取(TFIDF指标)&随机森林模型实现
10个令人相见恨晚的R语言包
新媒体管家 大约3年前我开始使用R,起初进展很慢,与我习惯的语言相比,语法更加直观也比较简单,而且需要一段时间才能习惯于细微的差别。我还不清楚语言的力量与社区和各种包的密切关系。 和其他语言(比如Py
CDA数据分析师
2018/02/08
1.6K0
10个令人相见恨晚的R语言包
关于我只有基因和变异类型,还想做oncoplot(瀑布图)这件事!
oncoplot (瀑布图)经常出现在肿瘤研究中的Fig1 ,可以展示多种变异类型的全景图。
生信补给站
2022/11/11
1.7K0
关于我只有基因和变异类型,还想做oncoplot(瀑布图)这件事!
R语言︱SNA-社会关系网络 R语言实现专题(基础篇)(一)
版权声明:博主原创文章,微信公众号:素质云笔记,转载请注明来源“素质云博客”,谢谢合作!! https://blog.csdn.net/sinat_26917383/article/details/51436643
悟乙己
2019/05/26
1.8K0
使用R语言挖掘QQ群聊天记录
1、获取数据 从 QQ 消息管理器中导出消息记录,保存的文本类型选择 txt 文件。这里获取的是某群从 2016-04-18 到 2016-05-07 期间的聊天记录,记录样本如下所示。 2、数据预处理 打开 R 软件,先通过 File—>Change dir 切换到聊天文件所在目录。 引入包: library(stringr) library(plyr) library(lubridate) library(ggplot2) library(reshape2) library(igraph) 没有的包要
机器学习AI算法工程
2018/03/14
1.4K0
当所有细胞基因表达量相同时如何更好的可视化?
绘制FeaturePlot时,遇到基因在所有细胞中表达水平相同展示效果不理想的情况,本文引入函数tryCatch()旨在解决上述问题,并将警告信息保存到日志文件中便于后续追踪。
生信技能树jimmy
2021/11/04
1K0
R&Python Data Science 系列:数据处理(4)长宽格式数据转换
在数据分析过程中,不同的软件通常对数据格式有一定的要求,例如R语言中希望导入的数据最好是长格式数据而不是宽格式数据,而SPSS软件经常使用宽格式数据。平时数据分析的时候,无法保证导入的数据一定是什么格式,因此需要了解长宽格式数据之间如何相互转换。
1480
2019/11/15
2.6K0
怎么用R语言把表格CSV文件中的数据变成一列,并且行名为原列名呢,谢谢
3,melt中,dd为对象数据框,id为不变的列数,这里是ID一列,列数所在的位置为1,其它几列都变成一列,然后列名变为行名。
邓飞
2020/05/17
7.4K0
推荐阅读
相关推荐
R语言基因组数据分析可能会用到的data.table函数整理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验