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