1. 程式人生 > >R語言-處理異常值或報錯的三個示例

R語言-處理異常值或報錯的三個示例


Tuesday, March 31, 2015

之前用rvest幫人寫了一個定期抓取amazon價格庫存,並與之前價格比較的小程式,算是近期寫過的第一個完整的程式了。裡面涉及了一些報錯的處理。

這裡主要參考了stackoverflow上的以下問答:

以下是程式碼示例:

1)使用tryCatch函式跳過錯誤資訊。(示例以download.file為樣式)

看以下程式碼。這裡需要批量下載一堆amazon產品資訊。如果產品ID號不對,或者IP被限制,網頁會打不開,而download.file會報錯。我這裡用tryCatch來獲取網頁打不開時的錯誤資訊。並且要求執行下一步迴圈“”。

for (n in 1:length(productlink)){
        tryCatch({
        download.file(productlink[n],paste0(getwd(),"/html/",productid[n,],".html"),cacheOK = TRUE)
        },error=function(e){cat("ERROR :",conditionMessage(e),"\n")})
        Sys.sleep(0.5) #增加了Sys.sleep(seconds)函式,讓每一步迴圈都暫停一段時間。這個雖然會降低程式速度,但對於有訪問限制的網站,不失為一個好的辦法。
}

上述示例由兩個重要函式構成,即tryCatch和cat

查閱函式,tryCatch屬於base包,condition system。在R語言使用tryCatch進行簡單的錯誤處理這篇博文裡有tryCatch的簡單示範如下:

result = tryCatch(
        {expr}, 
        warning = function(w) {warning-handler-code}, 
        error = function(e) { error-handler-code}, 
        finally = {cleanup-code}
        )

即如果warning時,對warning怎麼處理,如果error時對error怎麼處理。如果沒有任何條件吻合,則最後會輸出expr裡的內容。如果有final項的話,則會同時輸出finally項以及expr項

tryCatch({a<-"c"
        b<-"c"
        b==a},
        error=function(e){cat("hahaha",conditionMessage(e),"\n\n")},
        finally={print("ccc")})

[1] "ccc"
[1] TRUE

tryCatch({a<-"c"

         cc==a}, #cc不存在
        error=function(e){cat("hahaha",conditionMessage(e),"\n\n")},
        finally={print("ccc")})
hahaha object 'cc' not found 

對於程式碼示例,即為,download成功則返回download內容,不成功則返回error=function(e){cat("ERROR :",conditionMessage(e),"\n")}

然後是cat函式。這個cat是一個輸入輸出值。這裡等於,要求系統輸出“ERROR :”+conditionMessage(e)的內容。然後用“”分行。

另外,在stackoverflow上的這篇問答,由mmann1123回答的問題裡,我們看到了更為有趣的一個應用。

這裡收縮起來,展開亦可閱讀。

#!/usr/bin/env Rscript
# tryCatch.r -- experiments with tryCatch

# Get any arguments
arguments <- commandArgs(trailingOnly=TRUE)
a <- arguments[1]

# Define a division function that can issue warnings and errors
myDivide <- function(d, a) {
  if (a == 'warning') {
    return_value <- 'myDivide warning result'
    warning("myDivide warning message")
  } else if (a == 'error') {
    return_value <- 'myDivide error result'
    stop("myDivide error message")
  } else {
    return_value = d / as.numeric(a)
  }
  return(return_value)
}

# Evalute the desired series of expressions inside of tryCatch
result <- tryCatch({

  b <- 2
  c <- b^2
  d <- c+2
  if (a == 'suppress-warnings') {
    e <- suppressWarnings(myDivide(d,a))
  } else {
    e <- myDivide(d,a) # 6/a
  }
  f <- e + 100

}, warning = function(war) {

  # warning handler picks up where error was generated
  print(paste("MY_WARNING:  ",war))
  b <- "changing 'b' inside the warning handler has no effect"
  e <- myDivide(d,0.1) # =60
  f <- e + 100
  return(f)

}, error = function(err) {

  # warning handler picks up where error was generated
  print(paste("MY_ERROR:  ",err))
  b <- "changing 'b' inside the error handler has no effect"
  e <- myDivide(d,0.01) # =600
  f <- e + 100
  return(f)

}, finally = {

  print(paste("a =",a))
  print(paste("b =",b))
  print(paste("c =",c))
  print(paste("d =",d))
  # NOTE:  Finally is evaluated in the context of of the inital
  # NOTE:  tryCatch block and 'e' will not exist if a warning
  # NOTE:  or error occurred.
  #print(paste("e =",e))

}) # END tryCatch

print(paste("result =",result))
tryCatch示範

2)利用if語句以及stop語句。

即,如果某條件不成立,則停止程式,並輸出stop裡的內容。我這裡主要用於檢查原始product id是否輸入正確。

if (!sum(check)==length(productlink)) {
        productlink<-NULL
        productid<-NULL
    stop("invalid productid please double check if any space or else in, and resave the file or the script will not run")
    }

3)處理使用data.frame批量讀取資料時,元素因為不存在導致的data.frame報錯。

譬如說以下示例,因為a不存在,而導致data.frame報錯。

a<-NULL
b<-c("cc","dd")
data.frame(a,d)
> Error in data.frame(a, d) : 引數值意味著不同的行數: 0, 2

 因此,對於在迴圈裡,需要先單獨合成data.frame,再使用rbind把各個data.frame合成在一起時,可以考慮增加異常值的賦值。如下面兩段,如果我拉的網頁裡不存在product name,則length(productname)==1為FALSE,直接輸出“product not download or not existing”,那麼這個欄位就不是空值或者2-3個行,而是1行,之後合併為data.frame時就不會報錯了。

data<-function(n){
        ####隱掉獲得productname/price/category的程式碼
        if(!length(productname)==1) {productname="Product not download or not existing"}
        if (!length(price)==1) {
                        price=NA 
                        category<-"Product not download or not existing"
        }
        data.frame(productname,price,category)
        #這裡合成data.frame,如果這三個行數不等(多為空值NULL,或者某個欄位有2-3行所導致。
        #使用上面的IF判斷賦值的好處是,最後出來的productname,price,category保證是1行,可以用data.frame合併。並且對異常值也有輸出。

 由於處理第2/3類錯誤時我還不瞭解tryCatch函式。目前看下來,貌似tryCatch函式能做的事情更多?

寫下來供以後寫程式碼時參考。

另外,tryCatch在java,C裡均有類似功效。看來R歸根到底,還是脫離不了底層語言啊。

接下來4月的學習計劃,學完一個就寫一篇博文~~整理思路記錄筆記。

1)rCurl包,以及它那個厚厚的英文說明書。希望最後能學會用它爬一些rvest無法爬的指令碼網頁,以及搜尋框網頁等

2)用R做金融時間序列分析(煉數成金的班

3)跟著肖星老師重新複習財務分析知識(mooc課),在複習過去的財務知識後,再重新來看預測者網下的股票資料,嘗試做一下挖掘與分析,至少從巨集觀上了解當前中國上市公司的佈局與特點,為以後用R研究股票打打基礎。

 ----------

相關推薦

R語言-處理異常示例

Tuesday, March 31, 2015 之前用rvest幫人寫了一個定期抓取amazon價格庫存,並與之前價格比較的小程式,算是近期寫過的第一個完整的程式了。裡面涉及了一些報錯的處理。 這裡主要參考了stackoverflow上的以下問答: 以下是程式碼示例: 1)使用tr

R語言 處理缺失資料

簡單插補的一個優點是,解決“缺失值問題”時不會減少分析過程中可用的樣本量。雖然 簡單插補用法簡單,但對於非MCAR的資料會產生有偏的結果。若缺失資料的數目非常大,那麼簡單插補很可能會低估標準差、曲解變數間的相關性,並會生成不正確的統計檢驗的p值。應儘量避免使用該方法。

R語言 處理缺失(二)

資料來源:http://pan.baidu.com/s/1miRcns0 ##設定工作空間 #把“資料及程式”資料夾拷貝到F盤下,再用setwd設定工作空間 setwd("F:/資料及程式/chapter4/示例程式") #讀取銷售資料檔案,提取標題行 inputfile=

基於R語言的缺失異常處理

缺失值 缺失值是指粗糙資料中由於缺少資訊而造成的資料的聚類,分組,刪失或截斷。它指的是現有資料集中某個或某些屬性的值是不完全的。 缺失值的處理方法:對於缺失值的處理,從總體上來說分為刪除存在缺失值的個案和缺失值插補。對於主觀資料,人將影響資料的真實性,存在缺

Vue項目碰到"‘webpack-dev-server’不是內部外部命令,也不是可運行的程序處理文件"

node fill sta 新建 sso 用戶權限 環境 fonts IT 最近公司裏做vue項目,svn了前端同事的項目代碼,裝好環境,運行項目(安裝步驟隨便百度一下,很詳細),控制臺裏報錯“‘webpack-dev-server’不是內部或外部命令,也不是可運行的程序或

Glide入門教程——12.異常: 除錯和處理

文/簽到錢就到(簡書作者) 原文連結:http://www.jianshu.com/p/75aa0e4cd33f著作權歸作者所有,轉載請聯絡作者獲得授權,並標註“簡書作者”。 本地除錯 Glide的常規請求裡提供了一個方法設定Log的層級。不幸地是,你沒法輕易在產品使用中輕易獲取。但,也有一個很簡單的方法

R語言:缺失處理

一.什麼是缺失值,NA與NULL的區別 (1)NA表示資料集中的該資料遺失、不存在。在針對具有NA的資料集進行函式操作的時候,該NA不會被直接剔除。如x<-c(1,2,3,NA,4),取mean(x),則結果為NA,如果想去除NA的影響,需要顯式告知

R語言矩陣/缺失處理

缺失值處理一般包括三步: 1. 識別缺失資料; 2. 檢查導致資料缺失的原因; 3. 刪除包含缺失值的例項或用合理的數值代替(插補)缺失值。 1.判斷缺失值 函式is.na()、is.nan()和is.infinite()可分別用來識別缺失值

R語言中缺失NA的處理

一般在專案中,資料可能會因為裝置故障、未作答問題或誤編碼資料的原因不完整。在R中NA(not available,不可用)表示缺失值。         函式is.na()允許你檢測缺失值是否存在。該函式作用於檢測物件之後將返回一個相同大小的物件,其中缺失值的位置被改寫為t

python 列表,元組,字符串 切片 超出索引

如果 -1 使用 png image pytho log 邊界 技術 通常情況下,當我們以索引值對一個字符串,或者元組,列表取值時,如果索引超出邊界,就會報錯,但是如果我們使用切片呢? 字符串: 列表: 元組: 可以看到,這三種情況都沒有報錯,而是返回對應

HandlerExceptionResolver 全局異常攔截器

hresult ssd dna ada Coding base lob serve socket 3-Dec-2017 15:49:09.225 SEVERE [http-nio-80-exec-30] org.apache.catalina.core.StandardW

vue v-for 遍歷循環時的key

bsp ive using IT void 對象 key值 索引 AR 問題如下: [Vue warn] Avoid using non-primitive value as key, use string/number value instead. non-pr

R語言計算IV及使用

R語言 IV 更多風控建模、大數據分析等內容請關註公眾號《大數據風控的一點一滴》 在對變量分箱後,需要計算變量的重要性,IV是評估變量區分度或重要性的統計量之一,R語言計算IV值的代碼如下: CalcIV <- function(df_bin, key_var, y_var){ N_0<

Mysql關於處理emoji表情包問題的處理

mysql使用emoji表情的功能,在mysql 5.5 之前,UTF-8編碼只支援1-3個位元組;從MySQL 5.5開始,可以支援4個位元組UTF編碼 utf8mb4 ,一個字元能夠支援更多的字符集,也能夠支援更多表情符號。 utf8mb4相容utf8,且比utf8能表示更多的字元,是utf

2-6 R語言基礎 缺失

#缺失值 Missing Value > #NaN不可識別NA> x <- c(1,NA,2,NA,3) > is.na(x)[1] FALSE TRUE FALSE TRUE FALSE > is.nan(x)[1] FALSE FALSE FALSE FALSE FAL

R語言處理日期資料

《R語言實戰》學習筆記 —— 基本資料管理之日期值 1. 建立日期型變數 日期型通常以字串形式輸入到R中,然後轉化為以數值形式儲存的日期變數。日期具有一定的格式,見下表: 表1 日期格式 符號 含義 示例

R中read.csv第一行

問題描述: RStudio經常出現錯誤提示:Error: invalid multibyte character in parser at line 1 然後就不能編輯、儲存和運行了? Error in make.names(col.names, unique = TRUE

資料處理--缺失處理&異常處理

缺失值處理: 造成資料缺失的原因是多方面的,主要可能有以下幾種: 有些資訊暫時無法獲取,致使一部分屬性值空缺出來。 有些資訊因為一些人為因素而丟失了。 有些物件的某個或某些屬性是不可用的。如一個未婚者的配偶姓名。 獲取這些資訊的代價太大,從而未獲取資料。

處理PXC初始化和啟動

報錯一:pxc初始化報錯-bash-4.1$ cd /usr/local/mysql -bash-4.1$ ./scripts/mysql_install_db ./bin/my_print_defaults: error while loading shared libr

JPA hibernate 異常 id變更。identifier was altered

org.springframework.orm.jpa.JpaSystemException: identifier of an instance of com.thinkgem.jeesite.mo