R语言,循环:错误控制 异常控制

在R中,循环如果出错,程序就会被kill掉。对于计算开销较大的循环来说,这样的错误是难以忍受的。

  • 一种方法是逐步地debug,针对所有的情况都能提供处理方案,但是很费心费力;
  • 一种方法是使用错误 异常控制函数,把错误跳过 或者说,提升对错误的容忍能力,即容错性。

针对第二种方法,有try tryCatch等函数。网上虽然教程较少,但是也能学个大概。最不济,看R 帮助文件也是可以的。本文,主要是记录我遇到的问题和解决的方法。

问题背景

使用爬虫爬取表格。该表格结构简单,不涉及到动态网页相关知识。问题就在于内容较大,每页有500行,有7000+页。

  • 网页结构:静态网页
  • url结构:有规律
  • 网络状态:较差,难以次次连接成功
  • 出现的问题:连接不上(报错),连接超时(不报错,但是爬虫卡死了)

由于代码涉及到项目,所以具体细节不能公开。这里只是说明类似的问题和提供解决的思路。

代码撰写

略,下文使用expr1代表出现问题的代码块,其他expr\\d表示用于处理该过程的代码块。

错误控制

  • 针对爬虫连接网页失败,报错并打断进程的问题
  • 使用的R基础包中的函数 tryCatch
tryCatch(
  expr1, 
  error=function(e){
    expr2
  },finnally = {
    expr3
  }
)
  • tryCatch的思路是
    • run expr1
    • if expr1 is error, doing expr2
    • finnally, weather expr1 error or not, doing expr3
  • 我的代码与下面类似:
while(i != m+1){
  tryCatch(
     {
        expr1 # expr1是爬取网络的代码块 ,所以会遇到连接失败的error
        i = i+1 # 如果expr1有error,则该语句不会运行,因而下一次循环使用的还是本次循环的i值
      }, error = function(e){
          cat("Sleeping for net connection agian at i = ", i, "\n")
          Sys.sleep(10) # sleep 10s,而后重复发生了错误的那个i
      }, finnaly = {
    expr3 #是啥都行。我用来输出循环信息
      }
   )
}

异常控制

  • 针对连接超时,导致循环停滞,爬虫卡死的问题
  • 使用R.utils包的withTimeout函数
  • 我的代码类似于:
while(i != m+1){
  tryCatch(
    {
      R.utils::withTimeout(
        expr1,
        timeout = 60
      )
       i = i+1
    }, TimeoutException = function(ex){
        message("Times out! Now refresh it") # 输出提示信息。但是事实上Timeout函数已经终止了expr1,并开始下一次循环(i值不变)
    }, error = function(e){
        cat("Sleeping for net connection agian at i = ", i, "\n")
        Sys.sleep(10) # sleep 10s,而后重复发生了错误的那个i
    }, finnaly = {
        expr3 #是啥都行。我用来输出循环信息
    }
  )
}

感悟

爬取数据,虽然是爬,但是却是比手动复制粘贴优雅一千倍的贵族运动。电脑随便爬去吧,这边看会儿生信技能树、生信星球的推文或者去峡谷里维护一下正义,难道不香吗?😆

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,030评论 5 464
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,198评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 144,995评论 0 327
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,973评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,869评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,766评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,967评论 3 388
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,599评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,886评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,901评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,728评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,504评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,967评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,128评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,445评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,018评论 2 343
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,224评论 2 339