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

熱線電話:13121318867

登錄
首頁精彩閱讀做數(shù)據(jù)分析必須學(xué)R的4個理由
做數(shù)據(jù)分析必須學(xué)R的4個理由
2015-09-24
收藏

做數(shù)據(jù)分析必須學(xué)R的4個理由


R 是一種靈活的編程語言,專為促進探索性數(shù)據(jù)分析、經(jīng)典統(tǒng)計學(xué)測試和高級圖形學(xué)而設(shè)計。R 擁有豐富的、仍在不斷擴大的數(shù)據(jù)包庫,處于統(tǒng)計學(xué)、數(shù)據(jù)分析和數(shù)據(jù)挖掘發(fā)展的前沿。R 已證明自己是不斷成長的大數(shù)據(jù)領(lǐng)域的一個有用工具,并且已集成到多個商用包中,比如 IBM SPSS? 和 InfoSphere?,以及 Mathematica。

本文提供了一位統(tǒng)計學(xué)家Catherine Dalzell對 R 的價值的看法。

為什么選擇 R?

R 可以執(zhí)行統(tǒng)計。您可以將它視為 SAS Analytics 等分析系統(tǒng)的競爭對手,更不用提 StatSoft STATISTICA 或 Minitab 等更簡單的包。政府、企業(yè)和制藥行業(yè)中許多專業(yè)統(tǒng)計學(xué)家和方法學(xué)家都將其全部職業(yè)生涯都投入到了 IBM SPSS 或 SAS 中,但卻沒有編寫過一行 R 代碼。所以從某種程度上講,學(xué)習(xí)和使用 R 的決定事關(guān)企業(yè)文化和您希望如何工作。我在統(tǒng)計咨詢實踐中使用了多種工具,但我的大部分工作都是在 R 中完成的。以下這些示例給出了我使用 R 的原因:

R 是一種強大的腳本語言。我最近被要求分析一個范圍研究的結(jié)果。研究人員檢查了 1,600 篇研究論文,并依據(jù)多個條件對它們的內(nèi)容進行編碼,事實上,這些條件是大量具有多個選項和分叉的條件。它們的數(shù)據(jù)(曾經(jīng)扁平化到一個 Microsoft? Excel? 電子表格上)包含 8,000 多列,其中大部分都是空的。研究人員希望統(tǒng)計不同類別和標(biāo)題下的總數(shù)。R 是一種強大的腳本語言,能夠訪問類似 Perl 的正則表達(dá)式來處理文本。凌亂的數(shù)據(jù)需要一種編程語言資源,而且盡管 SAS 和 SPSS 提供了腳本語言來執(zhí)行下拉菜單意外的任務(wù),但 R 是作為一種編程語言編寫的,所以是一種更適合該用途的工具。

R 走在時代的前沿。統(tǒng)計學(xué)中的許多新發(fā)展最初都是以 R 包的形式出現(xiàn)的,然后才被引入到商業(yè)平臺中。我最近獲得了一項對患者回憶的醫(yī)療研究的數(shù)據(jù)。對于每位患者,我們擁有醫(yī)生建議的治療項目數(shù)量,以及患者實際記住的項目數(shù)量。自然模型是貝塔—二項分布。這從上世紀(jì) 50 年代就已知道,但將該模型與感興趣的變量相關(guān)聯(lián)的估算過程是最近才出現(xiàn)的。像這樣的數(shù)據(jù)通常由廣義估計方程式 (general estimating equations, GEE) 處理,但 GEE 方法是漸進的,而且假設(shè)抽樣范圍很廣。我想要一種具有貝塔—二項 R 的廣義線性模型。一個最新的 R 包估算了這一模型:Ben Bolker 編寫的 betabinom。而 SPSS 沒有。

集成文檔發(fā)布。 R 完美地集成了 LaTeX 文檔發(fā)布系統(tǒng),這意味著來自 R 的統(tǒng)計輸出和圖形可嵌入到可供發(fā)布的文檔中。這不是所有人都用得上,但如果您希望便攜異步關(guān)于數(shù)據(jù)分析的書籍,或者只是不希望將結(jié)果復(fù)制到文字處理文檔,最短且最優(yōu)雅的路徑就是通過 R 和 LaTeX。

沒有成本。作為一個小型企業(yè)的所有者,我很喜歡 R 的免費特定。即使對于更大的企業(yè),知道您能夠臨時調(diào)入某個人并立即讓他們坐在工作站旁使用一流的分析軟件,也很不錯。無需擔(dān)憂預(yù)算。

R 是什么,它有何用途?

作為一種編程語言,R 與許多其他語言都很類似。任何編寫過代碼的人都會在 R 中找到很多熟悉的東西。R 的特殊性在于它支持的統(tǒng)計哲學(xué)。

一種統(tǒng)計學(xué)革命:S 和探索性數(shù)據(jù)分析

140 字符的解釋:R 是 S 的一種開源實現(xiàn),是一種用于數(shù)據(jù)分析和圖形的編程環(huán)境。

計算機總是擅長計算 — 在您編寫并調(diào)試了一個程序來執(zhí)行您想要的算法后。但在上世紀(jì) 60 和 70 年代,計算機并不擅長信息的顯示,尤其是圖形。這些技術(shù)限制在結(jié)合統(tǒng)計理論中的趨勢,意味著統(tǒng)計實踐和統(tǒng)計學(xué)家的培訓(xùn)專注于模型構(gòu)建和假設(shè)測試。一個人假定這樣一個世界,研究人員在其中設(shè)定假設(shè)(常常是農(nóng)業(yè)方面的),構(gòu)建精心設(shè)計的實驗(在一個農(nóng)業(yè)站),填入模型,然后運行測試。一個基于電子表格、菜單驅(qū)動的程序(比如 SPSS 反映了這一方法)。事實上,SPSS 和 SAS Analytics 的第一個版本包含一些子例程,這些子例程可從一個(Fortran 或其他)程序調(diào)用來填入和測試一個模型工具箱中的一個模型。

在這個規(guī)范化和滲透理論的框架中,John Tukey 放入了探索性數(shù)據(jù)分析 (EDA) 的概念,這就像一個鵝卵石擊中了玻璃屋頂。如今,很難想像沒有使用箱線圖(box plot) 來檢查偏度和異常值就開始分析一個數(shù)據(jù)集的情形,或者沒有針對一個分位點圖檢查某個線性模型殘差的常態(tài)的情形。這些想法由 Tukey 提出,現(xiàn)在任何介紹性的統(tǒng)計課程都會介紹它們。但并不總是如此。

與其說 EDA 是一種理論,不如說它是一種方法。該方法離不開以下經(jīng)驗規(guī)則:

  • 只要有可能,就應(yīng)使用圖形來識別感興趣的功能。
  • 分析是遞增的。嘗試以下這種模型;根據(jù)結(jié)果來填充另一個模型。
  • 使用圖形檢查模型假設(shè)。標(biāo)記存在異常值。
  • 使用健全的方法來防止違背分布假設(shè)。

Tukey 的方法引發(fā)了一個新的圖形方法和穩(wěn)健估計的發(fā)展浪潮。它還啟發(fā)了一個更適合探索性方法的新軟件框架的開發(fā)。

S 語言是在貝爾實驗室由 John Chambers 和同事開發(fā)的,被用作一個統(tǒng)計分析平臺,尤其是 Tukey 排序。第一個版本(供貝爾實驗室內(nèi)部使用)于 1976 年開發(fā),但直到 1988 年,它才形成了類似其當(dāng)前形式的版本。在這時,該語言也可供貝爾實驗室外部的用戶使用。該語言的每個方面都符合數(shù)據(jù)分析的 “新模型”:

S 是一種在編程環(huán)境操作的解釋語言。S 語法與 C 的語法很相似,但省去了困難的部分。S 負(fù)責(zé)執(zhí)行內(nèi)存管理和變量聲明,舉例而言,這樣用戶就無需編寫或調(diào)試這些方面了。更低的編程開銷使得用戶可以在同一個數(shù)據(jù)集上快速執(zhí)行大量分析。

從一開始,S 就考慮到了高級圖形的創(chuàng)建,您可向任何打開的圖形窗口添加功能。您可很容易地突出興趣點,查詢它們的值,使散點圖變得更平滑,等等。

面向?qū)ο笮允?1992 年添加到 S 中的。在一個編程語言中,對象構(gòu)造數(shù)據(jù)和函數(shù)來滿足用戶的直覺。人類的思維始終是面向?qū)ο蟮?,統(tǒng)計推理尤其如此。統(tǒng)計學(xué)家處理頻率表、時間序列、矩陣、具有各種數(shù)據(jù)類型的電子表格、模型,等等。在每種情況下,原始數(shù)據(jù)都擁有屬性和期望值:舉例而言,一個時間序列包含觀察值和時間點。而且對于每種數(shù)據(jù)類型,都應(yīng)得到標(biāo)準(zhǔn)統(tǒng)計數(shù)據(jù)和平面圖。對于時間序列,我可能繪制一個時間序列平面圖和一個相關(guān)圖;對于擬合模型,我可能繪制擬合值和殘差。S 支持為所有這些概念創(chuàng)建對象,您可以根據(jù)需要創(chuàng)建更多的對象類。對象使得從問題的概念化到其代碼的實現(xiàn)變得非常簡單。

一種具有態(tài)度的語言:S、S-Plus 和假設(shè)測試

最初的 S 語言非常重視 Tukey 的 EDA,已達(dá)到只能 在 S 中執(zhí)行 EDA 而不能執(zhí)行其他任何操作的程度。這是一種具有態(tài)度的語言。舉例而言,盡管 S 帶來了一些有用的內(nèi)部功能,但它缺乏您希望統(tǒng)計軟件擁有的一些最明顯的功能。沒有函數(shù)來執(zhí)行雙抽樣測試或任何類型的真實假設(shè)測試。但 Tukey 認(rèn)為,假設(shè)測試有時正合適。

1988 年,位于西雅圖的 Statistical Science 獲得 S 的授權(quán),并將該語言的一個增強版本(稱為 S-Plus)移植到 DOS 以及以后的 Windows? 中。實際認(rèn)識到客戶想要什么后,Statistical Science 向 S-Plus 添加了經(jīng)典統(tǒng)計學(xué)功能。添加執(zhí)行方差分析 (ANOVA)、測試和其他模型的功能。對 S 的面向?qū)ο笮远裕魏芜@類擬合模型的結(jié)果本身都是一個 S 對象。合適的函數(shù)調(diào)用都會提供假設(shè)測試的擬合值、殘差和 p-值。模型對象甚至可以包含分析的中間計算步驟,比如一個設(shè)計矩陣的 QR 分解(其中 Q 是對角線,R 是右上角)。

有一個 R 包來完成該任務(wù)!還有一個開源社區(qū)

大約在與發(fā)布 S-Plus 相同的時間,新西蘭奧克蘭大學(xué)的 Ross Ihaka 和 Robert Gentleman 決定嘗試編寫一個解釋器。他們選擇了 S 語言作為其模型。該項目逐漸成形并獲得了支持。它們將其命名為 R。

R 是 S 的一種實現(xiàn),包含 S-Plus 開發(fā)的更多模型。有時候,發(fā)揮作用的是同一些人。R 是 GNU 許可下的一個開源項目。在此基礎(chǔ)上,R 不斷發(fā)展,主要通過添加包。R 包 是一個包含數(shù)據(jù)集、R 函數(shù)、文檔和 C 或 Fortran 動態(tài)加載項的集合,可以一起安裝并從 R 會話訪問。R 包向 R 添加新功能,通過這些包,研究人員可在同行之間輕松地共享計算方法。一些包的范圍有限,另一些包代表著整個統(tǒng)計學(xué)領(lǐng)域,還有一些包含最新的技術(shù)發(fā)展。事實上,統(tǒng)計學(xué)中的許多發(fā)展最初都是以 R 包形式出現(xiàn)的,然后才應(yīng)用到商用軟件中。
在撰寫本文時,R 下載站點 CRAN 上已有 4,701 個 R 包。其中,單單那一天就添加了 6 個 R 。萬事萬物都有一個對應(yīng)的 R 包,至少看起來是這樣。

我在使用 R 時會發(fā)生什么?

備注:本文不是一部 R 教程。下面的示例僅試圖讓您了解 R 會話看起來是什么樣的。

R 二進制文件可用于 Windows、Mac OS X 和多個 Linux? 發(fā)行版。源代碼也可供人們自行編譯。

在 Windows? 中,安裝程序?qū)?R 添加到開始菜單中。要在 Linux 中啟動 R,可打開一個終端窗口并在提示符下鍵入 R。您應(yīng)看到類似圖 1 的畫面。

R

圖 1. R 工作區(qū)

在提示符下鍵入一個命令,R 就會響應(yīng)。

此時,在真實的環(huán)境中,您可能會從一個外部數(shù)據(jù)文件將數(shù)據(jù)讀入 R 對象中。R 可從各種不同格式的文件讀取數(shù)據(jù),但對于本示例,我使用的是來自 MASS 包的 michelson 數(shù)據(jù)。這個包附帶了 Venables and Ripley 的標(biāo)志性文本 Modern Applied Statistics with S-Plus(參見 參考資料)。michelson 包含來自測量光速的流行的 Michelson and Morley 實驗的結(jié)果。

清單 1 中提供的命令可以加載 MASS 包,獲取并查看 michelson 數(shù)據(jù)。圖 2 顯示了這些命令和來自 R 的響應(yīng)。每一行包含一個 R 函數(shù),它的參數(shù)放在方括號 ([]) 內(nèi)。

清單 1. 啟動一個 R 會話

    2+2             # R can be a calculator. R responds, correctly, with 4.
    library("MASS") # Loads into memory the functions and data sets from 
                    # package MASS, that accompanies Modern Applied Statistics in S

    data(michelson) # Copies the michelson data set into the workspace.

    ls()            # Lists the contents of the workspace. The michelson data is there.

    head(michelson) # Displays the first few lines of this data set.
                    # Column Speed contains Michelson and Morleys estimates of the 
                    # speed of light, less 299,000, in km/s.
                    # Michelson and Morley ran five experiments with 20 runs each.
                    # The data set contains indicator variables for experiment and run.
    help(michelson) # Calls a help screen, which describes the data set.

圖 2. 會話啟動和 R 的響應(yīng)

R

現(xiàn)在讓我們看看該數(shù)據(jù)(參見 清單 2)。輸出如 圖 3 中所示。

清單 2. R 中的一個箱線圖

    # Basic boxplot

    with(michelson, boxplot(Speed ~ Expt)) 

    # I can add colour and labels. I can also save the results to an object.

    michelson.bp = with(michelson, boxplot(Speed ~ Expt, xlab="Experiment", las=1, 
                    ylab="Speed of Light - 299,000 m/s", 
                    main="Michelson-Morley Experiments",
                    col="slateblue1")) 
                 
    # The current estimate of the speed of light, on this scale, is 734.5
    # Add a horizontal line to highlight this value.

    abline(h=734.5, lwd=2,col="purple")  #Add modern speed of light

Michelson and Morley 似乎有計劃地高估了光速。各個實驗之間似乎也存在一定的不均勻性。

圖 3. 繪制一個箱線圖

R

在對分析感到滿意后,我可以將所有命令保存到一個 R 函數(shù)中。參見清單 3。

清單 3. R 中的一個簡單函數(shù)

    MyExample = function(){
        library(MASS)
        data(michelson)
        michelson.bw = with(michelson, boxplot(Speed ~ Expt, xlab="Experiment", las=1, 
        ylab="Speed of Light - 299,000 m/s", main="Michelsen-Morley Experiments", 
            col="slateblue1"))
        abline(h=734.5, lwd=2,col="purple")

    }

這個簡單示例演示了 R 的多個重要功能:

保存結(jié)果—boxplot() 函數(shù)返回一些有用的統(tǒng)計數(shù)據(jù)和一個圖表,您可以通過類似 michelson.bp = … 的負(fù)值語句將這些結(jié)果保存到一個 R 對象中,并在需要時提取它們。任何賦值語句的結(jié)果都可在 R 會話的整個過程中獲得,并且可以作為進一步分析的主題。boxplot 函數(shù)返回一個用于繪制箱線圖的統(tǒng)計數(shù)據(jù)(中位數(shù)、四分位等)矩陣、每個箱線圖中的項數(shù),以及異常值(在 圖 3 中的圖表上顯示為開口圓)。請參見圖 4。

圖 4. 來自 boxplot 函數(shù)的統(tǒng)計數(shù)據(jù)

R

 

公式語言— R(和 S)有一種緊湊的語言來表達(dá)統(tǒng)計模型。參數(shù)中的代碼 Speed ~ Expt 告訴函數(shù)在每個 Expt (實驗數(shù)字)級別上繪制 Speed 的箱線圖。如果希望執(zhí)行方差分析來測試各次實驗中的速度是否存在顯著差異,那么可以使用相同的公式:lm(Speed ~ Expt)。公式語言可表達(dá)豐富多樣的統(tǒng)計模型,包括交叉和嵌套效應(yīng),以及固定和隨機因素。

用戶定義的 R 函數(shù)— 這是一種編程語言。

R 已進入 21 世紀(jì)

Tukey 的探索性數(shù)據(jù)分析方法已成為常規(guī)課程。我們在教授這種方法,而統(tǒng)計學(xué)家也在使用該方法。R 支持這種方法,這解釋了它為什么仍然如此流行的原因。面向?qū)ο笮赃€幫助 R 保持最新,因為新的數(shù)據(jù)來源需要新的數(shù)據(jù)結(jié)構(gòu)來執(zhí)行分析。InfoSphere? Streams 現(xiàn)在支持對與 John Chambers 所設(shè)想的不同的數(shù)據(jù)執(zhí)行 R 分析。

R 與 InfoSphere Streams

InfoSphere Streams 是一個計算平臺和集成開發(fā)環(huán)境,用于分析從數(shù)千個來源獲得的高速數(shù)據(jù)。這些數(shù)據(jù)流的內(nèi)容通常是非結(jié)構(gòu)化或半結(jié)構(gòu)化的。分析的目的是檢測數(shù)據(jù)中不斷變化的模式,基于快速變化的事件來指導(dǎo)決策。SPL(用于 InfoSphere Streams 的編程語言)通過一種范例來組織數(shù)據(jù),反映了數(shù)據(jù)的動態(tài)性以及對快速分析和響應(yīng)的需求。

我們已經(jīng)距離用于經(jīng)典統(tǒng)計分析的電子表格和常規(guī)平面文件很遠(yuǎn),但 R 能夠應(yīng)付自如。從 3.1 版開始,SPL 應(yīng)用程序可將數(shù)據(jù)傳遞給 R,從而利用 R 龐大的包庫。InfoSphere Streams 對 R 的支持方式是,創(chuàng)建合適的 R 對象來接收 SPL 元組(SPL 中的基本數(shù)據(jù)結(jié)構(gòu))中包含的信息。InfoSphere Streams 數(shù)據(jù)因此可傳遞給 R 供進一步分析,并將結(jié)果傳回到 SPL。

R 需要主流硬件嗎?

我在一臺運行 Crunchbang Linux 的宏碁上網(wǎng)本上運行了這個示例。R 不需要笨重的機器來執(zhí)行中小規(guī)模的分析。20 年來,人們一直認(rèn)為 R 之所以緩慢是因為它是一種解釋性語言,而且它可以分析的數(shù)據(jù)大小受計算機內(nèi)存的限制。這是真的,但這通常與現(xiàn)代機器毫無干系,除非應(yīng)用程序非常大(大數(shù)據(jù))。

R 的不足之處

公平地講,R 也有一些事做不好或完全不會做。不是每個用戶都適合使用 R:

R 不是一個數(shù)據(jù)倉庫。在 R 中輸入數(shù)據(jù)的最簡單方式是,將數(shù)據(jù)輸入到其他地方,然后將它導(dǎo)入到 R 中。人們已經(jīng)努力地為 R 添加了一個電子表格前端,但它們還沒流行起來。電子表格功能的缺乏不僅會影響數(shù)據(jù)輸入,還會讓以直觀的方式檢查 R 中的數(shù)據(jù)變得很困難,就像在 SPSS 或 Excel 中一樣。

R 使普通的任務(wù)變得很困難。舉例而言,在醫(yī)療研究中,您對數(shù)據(jù)做的第一件事就是計算所有變量的概括統(tǒng)計量,列出無響應(yīng)的地方和缺少的數(shù)據(jù)。這在 SPSS 中只需 3 次單擊即可完成,但 R 沒有內(nèi)置的函數(shù)來計算這些非常明顯的信息,并以表格形式顯示它。您可以非常輕松地編寫一些代碼,但有時您只是想指向要計算的信息并單擊鼠標(biāo)。

R 的學(xué)習(xí)曲線是非平凡的。初學(xué)者可打開一個菜單驅(qū)動的統(tǒng)計平臺并在幾分鐘內(nèi)獲取結(jié)果。不是每個人都希望成為程序員,然后再成為一名分析家,而且或許不是每個人都需要這么做。

R 是開源的。R 社區(qū)很大、非常成熟并且很活躍,R 無疑屬于比較成功的開源項目。前面已經(jīng)提到過,R 的實現(xiàn)已有超過 20 年歷史,S 語言的存在時間更長。這是一個久經(jīng)考驗的概念和久經(jīng)考驗的產(chǎn)品。但對于任何開源產(chǎn)品,可靠性都離不開透明性。我們信任它的代碼,因為我們可自行檢查它,而且其他人可以檢查它并報告錯誤。這與自行執(zhí)行基準(zhǔn)測試并驗證其軟件的企業(yè)項目不同。而且對于更少使用的 R 包,您沒有理由假設(shè)它們會實際生成正確的結(jié)果。

結(jié)束語

我是否需要學(xué)習(xí) R?或許不需要;需要 是一個感情很強烈的詞。但 R 是否是一個有價值的數(shù)據(jù)分析工具呢?當(dāng)然是的。該語言專為反映統(tǒng)計學(xué)家的思考和工作方式而設(shè)計。R 鞏固了良好的習(xí)慣和合理的分析。對我而言,它是適合我的工作的工具。

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

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

數(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(); // 調(diào)用 initGeetest 進行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務(wù)器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產(chǎn)品形式,包括: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); }