SpiderMan

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

2020-09-09  本文已影响0人  东方不赞

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

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

问题背景

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

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

代码撰写

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

错误控制

tryCatch(
  expr1, 
  error=function(e){
    expr2
  },finnally = {
    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 #是啥都行。我用来输出循环信息
      }
   )
}

异常控制

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 #是啥都行。我用来输出循环信息
    }
  )
}

感悟

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

上一篇下一篇

猜你喜欢

热点阅读