R语言-程序异常或错误处理

R语言异常或错误处理


  问题1:在使用R语言(RCurl包)抓取网页的过程中,往往会因为有些页面超时,或者页面不存在而导致程序因为异常中断退出,进而使自动批量抓取数据的程序中断,这时就需要有人工干预,重新运行程序或重新启动服务,从而导致维护成本增加。

  问题2:使用R语言进行数据处理时,常常需要写批处理程序实现程序自动处理,但是可能会出现一些意想不到的错误,从而导致自动化过程中断,这时需要人工干预,增加不必要的劳动。

  我们希望程序运行过程中,如果碰到一些可以预计的错误,可以自动处理它们,忽略这些异常,继续执行后面的代码,那么可以使用try、tryCatch、withCallingHandlers函数进行异常的处理,让程序继续往下执行。

1. 在R中,有三个函数工具可以解决条件异常处理(包括错误)问题:

  • try() 如果出现错误,使用该函数可以跳过错误继续执行程序。
  • tryCatch() 指定控制条件,进行异常捕捉,然后采用对应的函数处理异常和错误。
  • withCallingHandlers() 是tryCatch()的变体,只是运行的上下文条件不同,它使用的情况很少,但是非常有用。

2. 函数参数详解与示例

  • try()

    • R语言中的异常处理和Java类似,使用了try()语句来捕获异常,不过没有对应的catch()语句。
    • 在使用try()函数捕获异常后,再对捕获的对象进行解析。
    • try()函数第一个参数为调用的方法,第二个参数为是否显示异常消息,如 try(…, silent=TRUE)

      如果表达式运行产生错误提示,try()函数会返回一个类(class)对象'try-error'。如果参数 silent=TRUE,错误信息将被隐藏,silent=FALSE,错误信息将显示到屏幕上。在这种情况下,如果'try-error'的错误类型在变量 x.inv 的类型(class)中 ,我们调用 next 语句终止当前循环的执行,进行下一次的循环,否则,我们添加 x.inv 的值到表达式 inverses 。(示例见如下代码)

      ###question1:###
      ###求解逆矩阵过程中出错!!!怎么跳过错误!!!###
      set.seed(1)
      count <- 1
      inverses <- vector(mode = "list", 100)
      repeat {
        x <- matrix(sample(0:2, 4, replace = T), 2, 2)
        inverses[[count]] <- solve(x)
        count <- count + 1
        if (count > 100) break
      }
      ################
    
      ###answer1:#####
      count <- 0
      inverses <- vector(mode = "list", 100)  
      repeat {  
          if (count == 100) break  
          count <- count + 1  
          x <- matrix(sample(0:2, 4, replace = T), 2, 2)  
          x.inv <- try(solve(x), silent=TRUE)  
          if ('try-error' %in% class(x.inv)) {
              next
          } else{ 
              inverses[[count]] <- x.inv  
          }
      } 
      inverses
      #inverses[!is.null(inverses)]
      inverses[!(inverses=='NULL')]
      ###############

      try() 允许出现错误后继续执行代码。例如,一般来说,如果你运行的函数引发错误,它会立即终止,并且不返回值:

      f1 <- function(x) {
        log(x)
        10
      }
      f1("x")
      #> Error in log(x): non-numeric argument to mathematical function

      但是,如果将产生错误的语句放在try()中,那么错误信息将被打印,但程序会继续执行:

      f2 <- function(x) {
        try(log(x))
        10
      }
      f2("a")
      #> Error in log(x) : non-numeric argument to mathematical funct
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值