當前位置:
首頁 > 最新 > 為什麼生態學家要學習Python或者R?

為什麼生態學家要學習Python或者R?

最近有幾位老師在微信裡面分享了學習Python的一些資料。與R相比,Python是一門真正意義上的編程語言,除了編寫腳本,用於數值計算之外,還可以編寫命令行程序,編寫帶用戶界面的應用程序,編寫網站,繪圖,調用C,C++以及Fortran等語言的函數庫等等。Python比R的應用領域更廣闊,除了為黑客提供各種黑科技外,還廣泛應用在化學、物理、天文、生物信息等領域,當然也非常好玩兒。這麼強大的語言,當然非常值得了解和學習。更難能可貴的是,很多Python的項目是開源的,也就是源代碼可以下載,供好事者仔細研究。Python的另外一個好處就是可以在不同的平台上使用,也可以編譯為獨立的程序運行。Python腳本也可以用來驅動MySQL,sqlite, ArcGIS, Adobe Indesign等軟體,進行二次開發,用途極廣。 Python資源極為豐富,有數以萬計的程序包, 其中不乏生物信息學軟體包。Biopython就是其中之一。BioPython程序包的一些函數可以對DNA序列進行複雜操作,實現對GenBank的訪問和查詢等。Python的語法簡潔,通俗易懂, 很容易上手。 Python用戶不需要搗騰層次複雜的花括弧,只需要留意縮進。Python還有pip程序包管理系統,編寫程序包也極為方便。掌握了Python,就掌握了這些資源。看了上面的介紹, 還沒有學Python的朋友,是不是動心了呢?

然而還有一個選擇,那就是R語言,也叫R軟體,R語言是驅動R軟體工作的命令。其實R語言的本質是S語言,S語言誕生於美國貝爾實驗室。不過實現S語言的軟體Splus售價太高,紐西蘭奧克蘭大學的兩個老師在教學過程中山寨了一下SPlus,他們用C語言和Fortran編寫了一個軟體,用來實現S語言,於是R軟體就誕生了。自從這兩個老師開放了R的源代碼之後,R受到了學術界的關注。因為S語言語法簡單,接近於很多人熟悉的C語言,在進行統計分析以及繪圖上有出色的表現。不僅如此,R秉承了UNIX的傳統,所有的命令, 包括程序包中的函數,都有非常詳細的幫助文件,這是很多語言和軟體所望塵莫及的。Python的很多程序包都沒有做到這一點。近幾年來,R語言成為生態學研究最流行的軟體,特別是在森林樣地數據處理、地理信息和空間處理、統計繪圖以及在系統發育比較分析,經濟學,貝葉斯統計等很多領域,都有一流的學者堅持使用R,一些新的統計方法也用R開發。從Springer以及Wiley,O"Reilly等著名出版商R相關圖書的出版情況,就可以了解到R的熱度。Tiobe編程語言熱度排名,R躥升到第8位,對於一門應用領域狹窄的腳本語言實屬不易。還有很多研究論文直接在附錄中給出了R代碼。英國生態學會的Methodsin Ecology and Evolution 雜誌更是開設專欄介紹生態學與進化分析的軟體包,其中R程序包占絕大多數。在過去,研究人員可能提供MatLab代碼或者SAS程序,然而最近幾年, 這種情況逐漸減少了。相比之下,提供Python代碼的生態學研究還不是很多。

對於生態研究來說,R與Python都是非常好的語言,R則更勝一籌。任何一門編程語言, 從入門到精通都需要很長時間練習,普通人即使花費很多時間, 也未必能夠掌握一門計算機語言的精髓,更別提能使用得出神入化。Python的語言的覆蓋面很廣,幾乎是我們能想到的腳本語言能做的事情,Python都是可以做到的。

但是,一門計算機語言, 能夠在一個學科中佔據絕對優勢,其實主要是看運氣,更重要的是取決於在這門腳本語言的發展過程中,有沒有足夠牛的牛人, 能夠做出一些開創性的工作,奠定良好的發展基礎。 例如, 之所以R軟體在系統發育比較分析(PhylogeneticComparative Methods)能占絕對優勢,根本原因在於法國進化生物學家E.Paradis編寫的APE程序包,因為這個程序包定義了phylo這種數據類型,設計了進化樹在R中儲存的格式以及基本的操作。這樣一來, 你想提取物種名, 就可以用 $tip.label提取;想為進化樹重新排序,就用ladderize(); 想繪圖,就用plot.phylo();Paradis創造了APE,在Analysisof Phylogenetics and Evolution一書中介紹了相應的操作。APE對進化樹的操作簡單易行,因此很快吸引了大量用戶,其中不乏一流學者,很多人在APE的基礎上開發了程序包,如laser,phytools, picante等等,引入了眾多新的分析方法,從此用R進行進化分析一發而不可收拾。對於群落生態來講,類似的例子是vegan程序包。這個程序包主要用來進行多元統計,對於群落生態學數據分析有舉足輕重的作用,例如計算alpha和beta多樣性,CCA,DCA排序以及方差分解,物種多度曲線等等只需要一個函數就完成了。 生成的結果,可以直接繪圖或者進行其他分析,極為方便。vegan也是眾多一流生態學者合作完成的。進行生物多樣性分析, vegan是繞不開的,而且越來越多的人開始使用vegan做群落數據分析,這也是很多人學習R的驅動力。在此之前,群落生態學家主要是用CANOCO或者TWINSPAN或者其他一些多元統計分析軟體進行數據處理,數據格式千差萬別,甚至每個軟體都有自己的數據格式。那時候, 就連Numerical Ecology的作者,大名鼎鼎的Pierre Legendre都也只能自己用Fortran寫程序。

R語言目前在中科院以及國內大學的生態和進化研究中已經非常重要。植物研究所賴江山博士的R語言培訓班和課程進行的如火如荼,次次爆滿。很多人學習R,不但是為了掌握一門技術, 更是為了了解資源。學習了一門語言,就打開了一門看世界的窗戶,其實編程語言也是如此,至少可以看看用這門編程語言能做什麼以及現有的資源有哪些。不過,學習的訣竅,就在於不要一下子學很多東西,而是要學得深入。雖然R語言或者Python已經入門,但是學的不夠精,即使代碼和程序包在就在那裡,自己也不清楚怎麼用。 ggplot2的作者Wickham在《Rfor Data Science》一書裡面說,作者建議讀者先學好一門語言,學到很熟很深的程度,然後自然就容易融會貫通,這種說法我十分贊同。

對於學過R語言的學生,什麼學到比較熟練了呢? 這裡說說自己編寫R程序包的感受。

其實學習R語言,並不一定非要求編寫什麼程序包。編寫程序包還涉及到一些Latex語言文檔,有時候涉及到調用C語言或者C++或者Fortran代碼,涉及到其他程序包的依賴以及編寫Description文件的格式以及UTF-8編碼等許許多多問題,需要一段時間去認真學習。而且隨著R的升級,R程序包編寫的要求也經常改變,原來能夠正常工作的程序包因為不符合要求就從CRAN下架了。還有不同操作平台編譯的限制,數據大小的限制等等。例如在檢查R程序包過程中有幾十項內容,不能有一條出錯,否則就不能提交到CRAN。對程序包的質量嚴格控制,並不是R管理團隊太苛刻了。最近昆明植物所一位老師就抱怨說,安裝一個R程序包,要依賴十個其他的包, 然後其中有些包又要依賴若干程序包,不過有一個二次依賴的程序包,因為不合格已經從CRAN移除了,這就導致程序包不能正常安裝。程序包沒有人好好維護的情況之下, 如果出現錯誤,就難免影響用戶的心情, 影響CRAN以及R的聲譽。當然, 你可以說, CRAN上的程序包都是作者負責的,出錯也是難免的,R核心團隊對此沒有任何責任。道理是如此,可是誰也不希望不靠譜的程序包太多。

2017年年底,我忽然收到維也納大學KurtHornik教授發來的email,讓我修改phylotools,原因是該程序包一些函數的例子里讀取用戶工作路徑之外的路徑,這違反了CRAN的規定。phylotools程序包主要是用來構建DNA序列的超級矩陣supermatrix的。2009年年底,我到華南植物園葛學軍研究員的實驗室補充浙江古田山大樣地DNA條形碼的數據,做了一些實驗之後,要把140多個種,每個種的rbcLa, matK,trnH-psbA基因分別比對,然後再拼成supermatrix。在計算機程序里,這是很容易實現的,但是如果用手工,就非常麻煩。當時還不熟悉R的我,編寫了一些R腳本,用來創建supermatrix,這些函數後來就成了phylotools的主體。2015年,重新檢查這個程序包後,我覺得很多函數寫得不夠好,於是將函數重新寫了一遍, 放到github託管了。這次收到email通知,讓我修改phylotools,我乾脆就把github上的新版本改了改,然後提交到CRAN。新版本很快就就在CRAN接收了,不過代價也是有的: 因為重寫了一些函數, 參數和舊版本不同,基於舊版本的R腳本其實已經不能用了。雖然如此,作為軟體包的作者,我還是覺得新版本的代碼優雅一些,函數設計更合理一些。相比之下,雖然對HK80以及spaa這兩個程序包都不太滿意,但是精力有限,就一直沒有修改。另外兩個R包,查詢植物科屬的plantlist以及列印植物標籤的herblabel一直都託管在r-forge以及github上,沒有在CRAN上那麼費心。

能夠編寫R程序包,是否代表具有很高的R編程水平?答案是否定的。 因為編寫程序包這件事, 只要是能編寫R函數的用戶,學習一點兒編寫程序包的技巧,都是可以弄出來的。能夠寫程序包,確實說明相當熟悉R語言了,至少是能編寫R函數了。能編寫函數是區分入門水平和較為熟悉一門語言的分水嶺。學習編程,入門階段熟悉的是語法,如賦值、調用函數、寫循環,如何查詢幫助;之後是數據操作,字元串操作與正則表達式,編寫函數,再之後就是各種演算法。有人說,演算法是函數的靈魂,很多情況下確實如此。因為函數就是為了實現一些功能,演算法告訴你應該怎樣實現這些功能。對演算法的理解不夠深入,函數就很難解決更深層次的問題,比如,要編寫一個用於CCA排序的函數或者進行方差分解的函數,沒有對相應理論很好掌握是不可能做到的。這些是真正考驗基礎理論和水平的地方,國內數量生態學家與國際同行核心競爭力的差距也就是在這裡。

學習計算機語言,無論是Python還是R,都是有助於培養好的思維習慣與嚴謹的態度。在編程過程中,錯一個標點符號都是不行的。與此同時, 學習編程還要理解很多抽象的概念,比如S3、S4方法,面向對象、繼承、多態性,也需要理解一些數學和統計學的內容,最小二乘法、極大似然、貝葉斯統計、非參數統計以及線性和混合模型等等。

將一個問題分解為能用程序解決的問題,需要化整為零,一步一步思考,然後步步為營,這樣從技術上問題也許就解決了。然而真正解決生態學與進化上的問題,發現新知識,提出新觀點,已經不是技術問題,是編程所不能回答的。這時候就需要將各種信息進行整合,深刻把握問題的本質,進行深入思考。編程的能力再強,如果沒有縱深的思考,沒有對問題的全局性把握,沒有從具體的學術問題出發,就很容易停留在技術層面,難有深刻的見解。無論是學習Python還是R,這個問題都需要仔細考慮的。

2018年1月9日 於 香港大埔

關注我們

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python 的精彩文章:

Selenium3+Python3環境部署

TAG:Python |