前言
R編程語言在數(shù)字分析與機器學習領(lǐng)域已經(jīng)成為一款重要的工具。隨著機器逐步成為愈發(fā)核心的數(shù)據(jù)生成器,該語言的人氣也必然會一路攀升。不過R語言當然也擁有著自己的優(yōu)勢與缺點,開發(fā)人員只有加以了解后才能充分發(fā)揮它的強大能力。
正如Tiobe、PyPL以及Redmonk等編程語言人氣排名所指出,R語言所受到的關(guān)注程度正在快速提升。作為一款誕生于上世紀九十年代的語言,R已經(jīng)成為S統(tǒng)計編程語言的一類實現(xiàn)方式。已經(jīng)擁有十八年R編程經(jīng)驗的高校教授兼Coursera在線平臺培訓師Roger Peng指出,“R語言已經(jīng)成為統(tǒng)計領(lǐng)域最具人氣的語言選項”。
“我之所以喜愛R語言,是因為它易于從計算機科學角度出發(fā)實現(xiàn)編程,”Peng表示。而R語言隨時間推移正呈現(xiàn)出愈發(fā)迅猛的發(fā)展態(tài)勢,并成為能夠?qū)⒉煌瑪?shù)據(jù)集、工具乃至軟件包結(jié)合在一起的膠水型語言,Peng解釋道。
“R語言是創(chuàng)建可重復(fù)性及高質(zhì)量分析的最佳途徑。它擁有數(shù)據(jù)處理所必需的一切靈活性及強大要素,”在線編程教育機構(gòu)Code School數(shù)據(jù)科學家Matt Adams指出?!拔矣肦語言編寫的大部分程序?qū)嶋H上都是在將各類腳本整理到項目當中?!?/p>
? ? r語言有什么優(yōu)劣勢分析
R語言擁有強大的軟件包生態(tài)系統(tǒng)與圖表優(yōu)勢
R語言的優(yōu)勢主要體現(xiàn)在其軟件包生態(tài)系統(tǒng)上?!褒嫶蟮能浖鷳B(tài)系統(tǒng)無疑是R語言最為突出的優(yōu)勢之一——如果某項統(tǒng)計技術(shù)已經(jīng)存在,那么幾乎必然存在著一款R軟件包與之對應(yīng),”Adams指出。
“其中內(nèi)置有大量專門面向統(tǒng)計人員的實用功能,”Peng表示。R語言具備可擴展能力且擁有豐富的功能選項,幫助開發(fā)人員構(gòu)建自己的工具及方法,從而順利實現(xiàn)數(shù)據(jù)分析,他進一步解釋稱?!半S著時間的推移,越來越多來自其它領(lǐng)域的用戶也被吸引到了R身邊來,”其中包括生物科學乃至人文學科等。
“人們能夠在無需申請權(quán)限的前提下對其進行擴展?!笔聦嵣?,Peng回憶稱多年之前R的使用方式就已經(jīng)給相關(guān)工作帶來了巨大便利?!爱擱語言剛剛誕生之時,它最大的優(yōu)勢就是以自由軟件的姿態(tài)出現(xiàn)。其源代碼以及所有一切都可供我們直接查看?!?/p>
Adams也表示,R語言在圖形及圖表方面的一切能夠都是“無與倫比”的。其dplyr與ggplot2軟件包分別用于進行數(shù)據(jù)處理與繪圖,且“能夠非常直觀地提升我的生活質(zhì)量,”他感嘆道。
在機器學習方面,R語言的優(yōu)勢則體現(xiàn)在與學術(shù)界的強大聯(lián)動效應(yīng),Adams指出?!霸谶@一領(lǐng)域的任何新型研究成果可能都會馬上以R軟件包的形式體現(xiàn)出來。因此從這個角度看,R語言始終站在技術(shù)發(fā)展的尖端位置,”他表示。“這種接入軟件包還能夠提供良好的途徑,幫助我們利用相對統(tǒng)一的API在R語言環(huán)境下實現(xiàn)機器學習研究?!盤eng進一步補充稱,目前已經(jīng)有眾多主流機器學習算法以R語言作為實現(xiàn)手段。
R的短板在于安全性與內(nèi)存管理
說了這么多優(yōu)勢,R語言當然也存在著一定不足。“內(nèi)存管理、速度與效率可能是R語言面臨的幾大最為嚴峻的挑戰(zhàn),”Adams指出?!霸谶@方面,人們?nèi)匀恍枰ν苿印乙泊_實正在推動——其進展與完善。此外,從其它語言轉(zhuǎn)投R懷抱的開發(fā)人員也會發(fā)現(xiàn)后者在某些設(shè)定上確實有些古怪?!?/p>
R語言的基本原理來自上世紀六十年代出現(xiàn)的各類編程語言,Peng解釋道?!皬倪@個意義上講,R語言在設(shè)計思路上屬于一項古老的技術(shù)成果。”這種語言的設(shè)計局限有時候會令大規(guī)模數(shù)據(jù)集處理工作遇到難題,他強調(diào)稱。因為數(shù)據(jù)必須被保存在物理內(nèi)存當中——但隨著計算機內(nèi)存容量的不斷提升,這個問題已經(jīng)在很大程度上得到了解決,Peng指出。
安全等相關(guān)功能并沒有被內(nèi)置在R語言當中,Peng指出。此外,R語言無法被嵌入到網(wǎng)絡(luò)瀏覽器當中,Peng表示。“我們不能利用它開發(fā)Web類或者互聯(lián)網(wǎng)類應(yīng)用程序。”再有,我們基本上沒辦法利用R語言當作后端服務(wù)器執(zhí)行計算任務(wù),因為它在網(wǎng)絡(luò)層面缺乏安全性保障,他表示。不過Amazon Web Services云平臺上的虛擬容器等技術(shù)方案的出現(xiàn)已經(jīng)在很大程度上解決了此類安全隱患,Peng補充道。
長久以來,R語言當中始終缺少充足的交互元素,他表示。但以JavaScript為代表的各類編程語言介入其中并填補了這項空白,Peng指出。雖然我們?nèi)匀恍枰肦語言處理分析任務(wù),但最終結(jié)果的具體顯示方式則可以由JavaScript等其它語言來完成,他總結(jié)道。
R語言并不單純面向高端程序員
不過Adams與Peng都會R視為一種易于接受的語言。“我本人并沒有計算機科學教育背景,而且從來沒想過要當一名程序員。將編程基礎(chǔ)知識納入技能儲備當然很不錯,但這并不是上手R語言的必要前提,”Adams指出。“我甚至并不認為R語言只適用于程序員。它非常適合那些面向數(shù)據(jù)并試圖解決相關(guān)問題的用戶——無論他們的實際編程能力如何,”他強調(diào)稱。
#e#
就一個R和SAS精通程度幾乎相同,在兩種環(huán)境下都做過比較大(moderately big, ~xx Gb)的數(shù)據(jù)分析,與其他語言環(huán)境嵌合(SQL, Perl, etc.。。),使用過的個人(統(tǒng)計專業(yè)人員,非編程專業(yè)人員)的感受而言如下:
R的優(yōu)點:
1. 免費。。。 開源。。。 (這是最重要的一點好不好,也是SAS流行于公司,R流行于研究機構(gòu)和大學的最主要原因)
2. 是專門為統(tǒng)計和數(shù)據(jù)分析開發(fā)的語言,各種功能和函數(shù)琳瑯滿目,其中成熟穩(wěn)定的一抓一把
3. 語言簡單易學。雖與C語言之類的程序設(shè)計語言已差別很大(比如語言結(jié)構(gòu)相對松散,使用變量前不需明確正式定義變量類型等等),但仍保留了程序設(shè)計語言的基礎(chǔ)邏輯與自然的語言風格。我這樣說可能讓人聽得云里霧里,但是如果你對SAS或者SPSS有一點點了解,就會明白我的意思了。。。
4. 小。。。 安裝程序只有50Mb左右,比起某些死貴且3個G的付費軟件真的是超級迷你小巧玲瓏。。。 因為體積輕便,運行起來系統(tǒng)負擔也小。
5. 同各種OS的兼容性好。我兩臺本本一臺Windows,一臺Linux,都用得很順手。相比之下,你有見過人在Mac上用SAS嗎。。。 這人是要多么的想不開。。。 =。 =
6. 因為用的人越來越多,又是開源,有很多配套的“插件”為其錦上添花。比如xtable里有一個函數(shù)可以直接將R里的表格導出為TeX格式;另有RStudio的插件讓你可以在同一個環(huán)境里寫TeX跑R并可在你的TeX文件中插入你的R代碼,多么的賢良淑德。。。 (這個插件我沒用過,不過我同學一天到晚在用)
7. 有R GUI和RStudio兩種風格供君選擇,說實話我覺得這兩種風格已經(jīng)涵括了大多數(shù)人的使用偏好。。。
8. 已經(jīng)提過了開源,還想再強調(diào)一下。各種包和函數(shù)的透明性極好,這使得對函數(shù)的調(diào)整和改良變得非常便利。只需要把源碼調(diào)出來,自己稍微修改一下就可以了。這種事情放在任何其他統(tǒng)計軟件里都近乎奢望。
9. 如果你做Bayesian,用R你有OpenBUGS, WinBUGS, JAGS等各種成熟活潑的包裹,很多語言又簡單又附帶各種預(yù)設(shè)的plot,你只需調(diào)用即可;還可以自己寫MCMC。如果你用SAS/SPSS/Stata,你可以。。。 @@? = =bbb
10. 漂亮又靈活的圖,大家也都已經(jīng)講過了。原本不是什么特別突出的長處(有則好,沒也沒啥),不過現(xiàn)在數(shù)據(jù)可視化越來越熱,也就一躍成為主要優(yōu)點了。
缺點:
1. 對大文本(text data)處理極差。。。 或者說data management本就不是R的強項。SAS于R的最大優(yōu)勢之一可能就在于它兼顧了數(shù)據(jù)分析和數(shù)據(jù)管理。在SAS里對數(shù)據(jù)進行各種復(fù)雜操作都相對容易,只需要簡單的DATA STEP(必要時結(jié)合PROC SQL)即可完成;在R里可就真的是千辛萬苦。。。 雖然也有相應(yīng)的aggregate, merge之類的函數(shù),但是大都不太好用。這也是為什么大家常常把數(shù)據(jù)(尤其是數(shù)據(jù)大時)在別的環(huán)境下整好/分割好再喂給R。人家術(shù)業(yè)有專攻,數(shù)據(jù)管理真是有些難為它了。
2. 內(nèi)存管理和平行處理(parallel processing/programming)都為人詬病。數(shù)據(jù)小時沒有感覺,數(shù)據(jù)大了就各種報錯。。。 =。 =
3. package的可靠性問題。我第一門完全使用R做作業(yè)的課是門統(tǒng)計課,教授已經(jīng)六十多歲,見過各種統(tǒng)計軟件的出生發(fā)展和湮沒。她同我們說到R時第一句話就是Never use a package before you understand the manual and confirm the validity of the functions. 也就是包裹雖然好,使用需謹慎。主要原因還是在于開源。不常用的package一定要搞清楚函數(shù)的用法和核實過輸出,不然真的不推薦使用。我個人也是傾向非常用函數(shù)盡量自己寫,至少錯了也容易debug.。。
4. 不得不提的package的版本問題。 就算你確認了包裹的可靠性并熟知了各個變量要怎么用,還是可能掉入潛在的陷阱=。 = 講個真事:去年工作的時候一個項目是使用11年某項目的一個貝葉斯模型分析新的數(shù)據(jù)。當年寫代碼的人因為相信末日說兩年前就已經(jīng)辭職環(huán)游世界去了,于是我只好獨自研讀他的代碼。第一步,很自然的,就是重復(fù)當年的分析結(jié)果。這時發(fā)現(xiàn)當年他用的一個package和現(xiàn)在的R已經(jīng)不兼容,于是就下載了這個package的最新版本。結(jié)果有一個簡單的credible interval怎么都重復(fù)不出來。。。 怎么怎么都重復(fù)不出來。。。 我都快絕望了。最后經(jīng)各種推理驗證,發(fā)現(xiàn)這個區(qū)別源自于新舊版本的函數(shù)內(nèi)部在對數(shù)據(jù)排序之后對NaN的不同處理。。。 而這個小小的修改未在任何地方留下任何文字記錄。所以怎么說呢。。。 很多時候還是寫自己的程序靠譜哇。。。
5. 當你跑比較大的simulation,對效率有要求的時候,有時還是不得不用C,這可能是10小時和10分鐘的差別,毫不夸張。
#e#
R語言的未來發(fā)展趨勢
雖然R語言有諸多優(yōu)勢,但它并不是萬能的——它畢竟是統(tǒng)計編程類語言。受到其算法架構(gòu)的通用性以及速度性能方面的影響,因此其初始設(shè)計完全基于單線程和純粹的內(nèi)存計算。雖然一般情況下無關(guān)R的使用,但在當今大數(shù)據(jù)條件下,這兩個設(shè)計思路的劣勢逐漸變得愈加刺眼。好在R的一些優(yōu)秀的擴展性包解決了上述問題,例如:
snow 支持 MPI、PVM、nws、Socket 通信,解決單線程和內(nèi)存限制;
multicore 適合大規(guī)模計算環(huán)境,主要解決單線程問題;
parallel R 2.14.0 版本增加的標準包,整合了 snow 和 multicore 功能;
R + Hadoop 在 Hadoop 集群上運行R代碼;
RHIPE 提供了更友好的R代碼運行環(huán)境,解決單線程和內(nèi)存限制;
Segue 利用 Amazon’s Web Services(EC2)。
這里需要著重提一下 parallel 包,該包是R核心團隊為了解決大數(shù)據(jù)計算問題而在標準安裝程序下新增的功能包
一些誤區(qū)
很多人認為R語言是 GNU 開源項目軟件,因此軟件的使用是“沒有任何保證”的。但在美國,R的計算結(jié)果被 FDA(Food and Drug Administration) 所承認;并且有報告指出與其他商業(yè)軟件相比,R的 Bug 數(shù)量非常少【注:UCLA (2006)。 R relative to statistical packages. Technical report, UCLA.】。
R 開發(fā)的核心團隊對于R的新功能持異常謹慎的態(tài)度,比如 cairographics 從 2007 年開始醞釀,直到上一個大版本(2011年)才引入到R標準安裝程序;byte-compile 功能更是經(jīng)歷了從 1999-2011年近 12 年的孵化【注:Ripley,B. (2011)。 The r development process. Technical report,Department of Statistics,University of Oxford.】。從這個角度講,R語言的代碼質(zhì)量以及運算結(jié)果的可信性是完全可以保證的。
當然,這里所說的是R的標準安裝程序包,并不代表所有擴展包的質(zhì)量。畢竟 3400+ 的擴展包質(zhì)量良莠不齊,雖然不乏一些優(yōu)秀的包(如 Rcpp、RODBC、VGAM、rattle),但必然存在一些擴展包質(zhì)量不佳的情況。
應(yīng)用的思考
R 語言并不是人人都能接觸到的語言,相對要小眾很多,有些人即便接觸到?jīng)]準也搞不清楚R到底有什么用途。對于走上這條路的人,經(jīng)常會有一些應(yīng)用困難,比如從個人學習角度而言。
雖然R語言的設(shè)計之初就是避免通過大量編程實現(xiàn)統(tǒng)計算法,但最基本的編程能力還是需要的,因此對于一般非計算機專業(yè)的工作者來說無疑提高了難度。
還有很多人提到,R語言的學習曲線非常陡峭。但從我多年的使用經(jīng)驗上看,陡峭的學習曲線并不是因為R語言本身,而是隱藏在后面的統(tǒng)計知識很難在短時間內(nèi)掌握的緣故。
從公司商業(yè)應(yīng)用的角度而言,也存在一些不可回避的問題。
首先是人力資源成本如何核算。
軟件成本問題,由于R是自由軟件,可以隨時隨地下載,因此對于企業(yè)來說如何度量成本是一個問題。
R的技能核定并沒有官方或機構(gòu)標準,簡歷上“熟練使用R語言”可能沒有任何意義。
實際上,即便沒有上述兩個問題,企業(yè)想招到R相關(guān)的人才也不那么簡單。
對于大量工作已由其他軟件實現(xiàn)(比如用 SAS)的公司來講,轉(zhuǎn)化成本很高。
技術(shù)支持獲取的問題。
R語言在現(xiàn)實中的應(yīng)用
R語言在現(xiàn)實中的應(yīng)用有哪些?主要有以下幾種?
1.數(shù)據(jù)科學
“哈佛商業(yè)評論”將數(shù)據(jù)科學家命名為“21世紀最性感的工作”。 Glassdoor將其命名為2016年的“年度最佳工作”。隨著IoT設(shè)備的誕生,創(chuàng)建了可用于做出更好決策的TB級和TB級數(shù)據(jù),數(shù)據(jù)科學是一個沒有其他方法可以追溯到的領(lǐng)域。
簡單的解釋說,數(shù)據(jù)科學家是一位具有額外資產(chǎn)的統(tǒng)計學家:計算機編程技能。 像R語言這樣的編程語言給數(shù)據(jù)科學家超能力,讓他們能夠?qū)崟r收集數(shù)據(jù),執(zhí)行統(tǒng)計和預(yù)測分析,創(chuàng)建可視化和向利益相關(guān)者傳達可行動的結(jié)果。
大多數(shù)數(shù)據(jù)科學課程包括R語言課程中,因為它是數(shù)據(jù)科學家最喜歡的工具。
2.統(tǒng)計計算
R語言是統(tǒng)計學家中最流行的編程語言。 事實上,它最初是由統(tǒng)計學家為統(tǒng)計學家建立的。 它有一個豐富的軟件包存儲庫,擁有超過9100個軟件包,您可以用于計算每個統(tǒng)計功能。
R語言的表達語法允許研究人員 - 即使是來自非計算機科學背景的研究人員,可以從各種數(shù)據(jù)源快速導入,清理和分析數(shù)據(jù)。
R語言還具有圖表功能,這意味著您可以繪制數(shù)據(jù)并從任何數(shù)據(jù)集創(chuàng)建有趣的可視化圖形。
3.機器學習
R語言已經(jīng)在預(yù)測分析和機器學習中發(fā)現(xiàn)了很多用途。它具有用于常見ML任務(wù)的各種包,如線性和非線性回歸,決策樹,線性和非線性分類等等。
從機器學習愛好者到研究人員的每個人都可使用R語言來實現(xiàn)機器學習算法,如金融,遺傳學研究,零售,營銷和醫(yī)療保健等領(lǐng)域。
評論
查看更多