《数据科学:R语言实现》——1.10 处理函数中的错误

1.10 处理函数中的错误

如果你对现代编程语言比较熟悉,你应该已经在开发过程中,使用try、catch以及block函数解决过可能的错误。R语言在函数中也提供了类似的错误处理方案。因此,你可以在R代码中添加错误处理机制来使程序变得更加健壮。在本教程中,我们会介绍R中基本的错误处理函数。

准备工作

确保你已经在操作系统中安装了R语言,完成了之前的步骤。

实现步骤

执行下列步骤,来处理函数中的错误。

  1. 首先,查看错误信息:
  2. 在用户定义的函数中,如果结果与预期不同,我们也可以使用stop打印出错误信息:

3.如果我们把函数stop换成函数warning会发生什么:

4.再来看看,如果把函数warning去掉会发生什么 :

  1. 为了抑制报警,我们可以把函数封装在函数suppressWarnings中:
  2. 我们也可以使用函数try来捕捉错误信息:
  3. 通过设定静默选项,我们可以抑制错误信息在控制台的展示:
  4. 而且,我们可以使用函数try来避免跳出for循环。这里,我们展示一个没有使用try的for循环:


  1. 现在,让我们看看,如果我们给代码插入函数try会发生什么:
  2. 对于参数,我们可以使用函数stopifnot来检查:
  3. 为了处理各种错误,我们可以使用函数tryCatch:


运行原理

类似于其他编程语言,R语言给开发人员提供了一套错误处理机制。然而,R中的错误处理机制是通过函数实现的,而不是通过纯代码块实现的。 这是因为所有的操作都是纯函数调用。

在第1步中,我们展示了给字符串添加一个整数而导致的输出。如果这个操作是非法的,系统会在控制台打印出一条错误消息。R中有3种基本的错误处理消息,分别是error、warning和interrupt。

然后,我们创建了名为addnum的函数,它的作用是返回两个变量的和。然而,有时,你会给函数传递一个意外类型的输入(例如字符串)。此时,我们可以在return语句之前添加一条参数类型检查条件。如果输入数据的类型都不是数值型的,函数stop会调用函数内部的错误消息打印出来。

除了使用函数stop,我们还可以使用函数warning来处理错误。但是,仅仅使用函数warning,函数并不会中断,会继续返回a+b。因此,我们在控制台上,既可以找到错误消息,也可以找到警告消息。为了抑制警告消息,我们可以在函数options中设置warn=2,或者也可以使用函数suppressWarnings来屏蔽所有警告消息 。另外,我们还可以使用函数 stopifnot来检查参数是否合法。如果输入是非法的,我们可以中止程序,并在屏幕上打印出错误消息。

接下来,我们可以使用函数try捕捉错误。这里,我们把字符串赋给了一个整数,这一错误信息会存在errormsg中。但是,函数还是会把错误消息打印到屏幕上。我们可以把参数silent设置为TRUE来屏蔽消息。而且,如果我们不希望一个for循环被意外的错误所打断,函数try是非常有用的。因此,我们首先展示了一个错误是如何意外地中断循环操作的。在这一步中,我们可以看到循环操作停止了,我们仅仅把3个变量成功地指派给了res。事实上,我们也可以把代码封装到函数try中,来继续执行for循环。

除了函数try,我们也可以使用更高级的错误处理函数tryCatch,来处理warning和error。我们通过以下方式使用函数tryCatch:

在这个函数中,我们使用不同的代码块来捕捉warning和error消息。依照函数的形式,我们创建了名为dividenum的函数。这个函数首先执行数值除法;不管产生何种错误,我们都可以使用函数error来捕捉错误并打印错误消息。在代码块的底部,我们移除了所有函数中定义的数值,并打印出消息clean variable。此处,我们可以测试一下,在3种不同情况下,函数是如何工作的:执行正常除法,从字符串中分离子字符串,以及只给函数传递一个参数。 现在我们可以看到3种不同条件下的消息输出。在第1种情况下,函数会打印出除法结果,并跟着clean variable。因为clean variable是代码块finally实现的。在第2种情况下,函数首先在代码块error中捕捉了缺失值错误,并在底部输出clean variable。在最后一个情况下,我们并没有捕捉未给参数b传递a值的错误,但是函数依然首先返回了一条错误消息,然后在控制台上打印clean variable。

更多技能

如果你想在使用函数tryCatch的时候捕捉错误信息,可以在函数tryCatch的error参数中放一个conditionMessage:

在这个例子中,如果你给函数dividenum传递两个合法的数值参数,函数会返回3/5作为输出。另外,如果你给函数传递一个非数值输入,函数会使用函数conditionMessage来捕捉错误,并输出错误。

时间: 2024-11-25 05:30:06

《数据科学:R语言实现》——1.10 处理函数中的错误的相关文章

《数据科学R语言实践:面向计算推理与问题求解的案例研究法》一一2.3 数据清洗和变量格式化

2.3 数据清洗和变量格式化 本节我们考虑如何将特征矩阵列表menResMat转换为合适的格式以便于数据分析.目前,这些数据值都是字符型,这对于诸如找到参赛者年龄的中位数这样的数据分析是无益的.但是,我们可以利用as.numeric()函数很容易地将年龄转换为数值型.我们需要将整个矩阵都转换为数值型矩阵吗?事实并非如此,比如将参赛者的名字转换为数值型就毫无意义.为此,我们需要创建一个可以允许拥有不同类型变量的数据框.现在我们有6个变量:参赛者姓名.居住地.年龄以及3种类型的时间.正如刚才所说,我

《Python数据科学指南》——1.12 在函数中嵌入函数

1.12 在函数中嵌入函数 这一节将解释函数式编程里的另一个概念:在一个函数中定义另一个函数. 1.12.1 准备工作 我们写一个简单的函数,它返回输入列表的数值的平方和. 1.12.2 操作方法 我们定义一个简单的函数,用它演示在函数中嵌入函数. # 1.定义一个函数,返回给定输入数值的平方和 def sum_square(x): def square_input(x): return x*x return sum([square_input(x1) for x1 in x]) # 2.输出结

《R的极客理想——高级开发篇 A》一一第1章 R语言知识体系和数学函数

第1章 R语言知识体系和数学函数 本章为全书开篇,主要介绍了R语言知识体系结构及学习资料.利用R语言实现数学计算和统计计算以及连续型分布函数的可视化,可帮助读者全面理解R语言,并利用R语言快速地处理基础学科的计算问题.

手把手 | 教你爬下100部电影数据:R语言网页爬取入门指南

前言 网页上的数据和信息正在呈指数级增长.如今我们都使用谷歌作为知识的首要来源--无论是寻找对某地的评论还是了解新的术语.所有这些信息都已经可以从网上轻而易举地获得. 网络中可用数据的增多为数据科学家开辟了可能性的新天地.我非常相信网页爬取是任何一个数据科学家的必备技能.在如今的世界里,我们所需的数据都在互联网上,使用它们唯一受限的是我们对数据的获取能力.有了本文的帮助,您定会克服这个困难. 网上大多数的可用数据并不容易获取.它们以非结构化的形式(HTML格式)表示,并且不能下载.因此,这便需要

2013年数据分析、数据挖掘、数据科学使用语言排行榜

 最受欢迎的语言仍然是R( KDnuggets 读者中有61%用户在用),python(39%),SQL(37%).SAS仍然稳定在20%之间.增长最快是:Pig/Hive/Hadoop为基础的语言.R.SQL,同时perl, C/C++, 与Unix 在下降.同时我们发现,R与python用户存在一定的重叠. 之前的KDnuggets的调查主要是关注:统计与分析软件,但有时候一个全面与强大的编程语言是需要的.这也是最近一次的KDnuggets调查关注的重点,我们咨询: 在2013年中,什么样的

《Python数据科学指南》——1.11 将函数作为变量传递

1.11 将函数作为变量传递 Python支持函数式编程,除了命令范式.在前面的章节中,我们已经接触到了一些函数式编程的概念,不过没有明确地说明,在这节里,我们再来回头看看.在Python中,函数是一等公民,它们拥有属性,可以被引用,并且可以被分配给一个变量. 1.11.1 准备工作 这节里我们将研究函数作为变量传递的范例. 1.11.2 操作方法 我们先定义一个简单的函数,然后看看如何将它当作变量来使用. # 1.定义一个简单的函数 def square_input(x): return x*

《Python数据科学指南》——1.13 将函数作为参数传递

1.13 将函数作为参数传递 Python支持高阶函数功能:将一个函数作为另一个函数的参数传递. 1.13.1 准备工作 我们将前面一个例子中的函数square_input ()重写,以此演示一个函数是如何被作为另一个函数的参数进行传递. 1.13.2 操作方法 请看如何将一个函数作为另一个函数的参数进行传递. from math import log def square_input(x): return x*x # 1.定义一个类函数,它将另外一个函数作为输入 # 并将它应用到给定的输入序列

c语言-void TBLFree (MNG* pMng)函数中的Free为何会意外跳出!

问题描述 void TBLFree (MNG* pMng)函数中的Free为何会意外跳出! /******************************************************************//* Module: TBLFree // Function: free list / / Input: * pMng // Output: pMng *// NOTE: // Return: void //********************************

《数据科学:R语言实现》——导读

前 言 大数据.物联网.人工智能已经变成近几年最热门的科技流行语.尽管大家用很多名词去定义这些技术,但是共通的思想是它们都是数据驱动的.人们并不满足于简单地拥有数据,因为发现其中的价值才是最本质的.因此数据科学家已经开始关注如何从原始数据中洞悉深层价值. 数据科学已经变成学术界和产业界最流行的话题.但是数据科学是一门非常宽泛的学科,学会掌握数据科学注定很有挑战性.初学者必须学习如何准备.处理.聚合和可视化数据.而更多高级技能包括机器学习,挖掘各种数据格式(文本.图像和视频),以及最重要的-使用数