99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀R語言-處理異常值或報錯的三個示例
R語言-處理異常值或報錯的三個示例
2017-01-12
收藏

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

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

這里主要參考了stackoverflow上的以下問答:
How to skip an error in a loop
skip to next value of loop upon error in R
tryCatch部分,后續(xù)查找資料,發(fā)現(xiàn)以下博文: 1. R語言使用tryCatch進行簡單的錯誤處理

以下是代碼示例:

1)使用tryCatch函數(shù)跳過錯誤信息。(示例以download.file為樣式)

看以下代碼。這里需要批量下載一堆amazon產品信息。如果產品ID號不對,或者IP被限制,網頁會打不開,而download.file會報錯。我這里用tryCatch來獲取網頁打不開時的錯誤信息。并且要求執(zhí)行下一步循環(huán)“”。

復制代碼
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)函數(shù),讓每一步循環(huán)都暫停一段時間。這個雖然會降低程序速度,但對于有訪問限制的網站,不失為一個好的辦法。
}
復制代碼
上述示例由兩個重要函數(shù)構成,即tryCatch和cat
查閱函數(shù),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函數(shù)。這個cat是一個輸入輸出值。這里等于,要求系統(tǒng)輸出“ERROR :”+conditionMessage(e)的內容。然后用“”分行。
另外,在stackoverflow上的這篇問答,由mmann1123回答的問題里,我們看到了更為有趣的一個應用。
這里收縮起來,展開亦可閱讀。
 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批量讀取數(shù)據(jù)時,元素因為不存在導致的data.frame報錯。

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

a<-NULL
b<-c("cc","dd")
data.frame(a,d)
> Error in data.frame(a, d) : 參數(shù)值意味著不同的行數(shù): 0, 2
 因此,對于在循環(huán)里,需要先單獨合成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,如果這三個行數(shù)不等(多為空值NULL,或者某個字段有2-3行所導致。
        #使用上面的IF判斷賦值的好處是,最后出來的productname,price,category保證是1行,可以用data.frame合并。并且對異常值也有輸出。
復制代碼
 由于處理第2/3類錯誤時我還不了解tryCatch函數(shù)。目前看下來,貌似tryCatch函數(shù)能做的事情更多?

寫下來供以后寫代碼時參考。

另外,tryCatch在java,C里均有類似功效??磥鞷歸根到底,還是脫離不了底層語言啊。

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

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

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

3)跟著老師重新復習財務分析知識(mooc課),在復習過去的財務知識后,再重新來看預測者網下的股票數(shù)據(jù),嘗試做一下挖掘與分析,至少從宏觀上了解當前中國上市公司的布局與特點,為以后用R研究股票打打基礎。

數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師考試動態(tài)
數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調用 initGeetest 進行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調,回調的第一個參數(shù)驗證碼對象,之后可以使用它調用相應的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }