接觸 R 的時間大約五個月了,從原本對電腦、程式一竅不通到現在能有效率的 debug、寫出簡潔有條理的 R code、甚至用 R 與 Markdown 架站寫部落格。算一算,我每週通常至少 3 天會用到 R,不是督促自己熟悉 R,是因為它太有魅力了。
學 R 語言很有趣1,但也相當耗時耗力。我在學習 R 上花了大量的時間,若不是運氣好找到對的方向,我不可能花費那麼多力氣去學 R,甚至可能直接放棄。雖然如此,我還是感到有點可惜,若能更早知道有效率的學習方式,就不必花費如此大量的時間 (及紙張) 在學習上。因此,我希望將學習 R 的心路歷程寫下,給想學 R 的人做為參考,或許可以減短學習初期耗費精神的時期。接下來,我將說明:
我學習 R 的動力來源
R 學習路徑:若從頭來過,我會如何學習 R、挑選哪些資源,讓自己更有效率地學習。
為何我能持續學習 R 而未放棄?其實現在我比較頭大的問題是:要怎麼克制自己不要一直打開 Rstudio?正是因為我學 R 的過程如同打電動一樣歡樂,所以放棄這個問題根本不存在。但事實上,剛開始學 R 時並不如何歡樂,直到上了課才越來越喜歡 R。
課程回顧
106學年上學期,我最喜歡、也意外收穫最多的課是謝舒凱老師開設的 R 語言與資料科學導論,或許會是我大學生涯最喜歡的課吧。
起初是抱著學好 R 語言 (加上通識快修不完) 的心情去加簽這門課的,但課堂上 R 語言的語法卻教得不多。然正是這種不聚焦在程式語法的課程安排,讓我把 R 學得非常好。如果課程從頭到尾都在教 R 語言,到期末我一定會受不了越顯複雜的語法,最後便隨意敷衍了事。我在這門課收穫最大的,反而不是課堂學到的技巧,而是老師、助教們傳達的一些概念與想法,以及自己探索這些概念想法的樂趣與收穫:
這門課與我個性相符,完全顯現在第一堂課實習課 (Lab Session) 的作業上。作業與 R 並無相關,而是要使用 Markdown 格式撰寫自我介紹。由於我對簡約風有點痴迷7 (受 Markdown 影響後更為痴迷),在 Markdown 上花了一些時間研究。目前,透過 R 與 Pandoc Markdown 語法的整合 (即 R Markdown),我可以快速簡潔地寫出含有上下標、Footnotes、超連結、citation 的精美文件8或文章 (例如,這篇部落格) 而完全不須使用 html 語法。這讓我在寫許多作業時,效率提高不少。
對 R Markdown 的痴迷與熱愛可說是我R語言功力進步的關鍵。R Markdown 賦予每個人將想法傳達給其他人的能力9,因此,能做出美好的東西並與其他人分享成為我學習 R 最強烈的動機之一。例如,當初在做這門課的期末專案 時,發覺 R 可以畫出很多種互動式圖表 (不須懂 JavaScript),於是我開始尋找最適合呈現資料的方式。由於不同種類的圖,常有不同資料格式的要求10,因此為了畫出最適合的圖,我反覆整理許多資料以符合格式。這使得我在 data wrangling 上,能力大幅提升。
R 學習路徑
起步
我剛開始學 R 時不算順遂11。剛進到 R 的世界,一定會被為數眾多的 function12 (以及更多的學習資源) 搞得迷失方向,不知從何開始。事實上,這不是我們的錯,因為連 R 的社群內也有相關的爭論:Base R first vs. Tidyverse first (詳細可參考此文)。R 真的是一個使用門檻不低的軟體,要精通它不是一、兩年內的事情13,所以一定要對 R 有熱情,才可能持續支撐對於 R 的學習14。
R 語言的基礎 ─ Base R 是剛開始學 R 的一大障礙,這也是為何會有 Base R first vs. Tidyverse first debate。由於學好 R (更精確地說,是學好 Base R) 需一段時間,我認為 Base R first 的學習方式很容易使初學者放棄。但學習 R 不可能不接觸 Base R ,因為它是 R 語言最重要的基礎。因此,我覺得最好的方式是交錯並進:
Base R 學到一定的基礎後 (不必精通) 15,開始學習用tidyverse套件處理資料。之後隨著時間,自然而然就會熟悉這兩者。
修課:我非常建議在學校修一門 R 語言的課 (最好 3 學分以上),但不建議線上課程16。修課的話,有老師和助教提供經驗,能省下許多摸索的時間;每週有固定進度,或多或少可迫使自己持續接觸程式;若有期末專案,這會是 R 功力突飛猛進的最佳機會 (效果比起純粹練習好太多)。
讓自己喜歡 R:初學 R 時因為不知道這項的重要性,所以學得有點辛苦。這點真的很微妙,有時候太過專注於學習某項"技能",反而會過於專注實用性而忽略了趣味性,於是只剩理性說服自己:學這很有用,你一定要堅持下去。通常開始這樣想,代表離放棄不遠了。這也是為何我很推 R 語言與資料科學導論 這門課的原因 ─ 老師真的很有智慧,不斷鼓勵學生們去想有趣又可用資料科學回答的問題,也常介紹一些 R 意想不到的有趣應用,但從未將焦點放在程式的硬實力上。我自己由 R 善於視覺呈現的特質切入 – 從 R Markdown 開始,擴展到資料視覺化,又到網頁設計 (縱使我html和css基礎很差),每一項對我來說都非常有趣,R 學起來因而樂此不疲。
實作:專案
看再多參考書、修再多課、做再多練習題都比不上實際去完成一個專案。在實作專案的過程中,會遇到一缸子自己不知如何解決的問題,因此過程中就是在不斷吸收新知識、學習如何問問題17,如此的學習效果是零散練習題的好幾倍。此外,做專案是自頭至尾走過一次資料科學的流程,從爬資料、整理、分析到呈現,將先前習得的零碎技巧組織在一起,會讓 R 的功力大增;同時,資料科學專案是在實際解決 (回答) 一個問題,這不僅對於自己,且對於社會有實質的意義與價值。
Hands-On Programming with R:這是一本寫得非常好且相當簡單的書,目標讀者是沒有程式經驗的初學者 (雖然我覺得縱使有程式經驗也可看這本書了解 R 的邏輯)。此書內容僅聚焦在非常基礎的 Base R,但重點是其將 R 的邏輯寫得非常清楚。我是在學 R 一陣子之後才看了這本書,對我有莫大的幫助。這本書相當短,可以很快看完,更多資訊請 google 書名。
R for Data Science:這本書應該只會越來越紅。如同其名,這本書就在教 R 於資料科學上的應用。與上本書不同的是,這本書以tidyverse套件為基礎而非 Base R。雖然如此,此書並不需要 Base R 的基礎 (有的話會更好,所以我才推薦 Hands-On),需要的基礎書中都有介紹。
我建議可以先從 Hands-On Programming with R 開始,因為這本書很短可以快速看完。之後再按照章節慢慢看 R for Data Science (可配合學校上課進度,這本書短時間內看不完),逐步累積自己的功力。
上述兩本書都是英文的,或許有些人很抗拒英文,但中文書並非一個好選擇。當 R 學到某個程度後,更進階的資源幾乎全為英文;此外,google 問題解決方法時,用中文十之八九會找不到答案。看英文書可讓自己熟悉 R 的英文用語,而且這些書的英文都很簡單。
若有志探索 R 的其它可能性,可以參考 bookdown.org 的書 (僅推薦 Star 100 以上,上面還是有一些雷書)。這裡的書都是用bookdown套件寫的,而且皆為 open source,可以在網頁上看或下載到電腦 (詳見bookdown套件)。
學校課程:如課程回顧所提及,一門 R 的課可以讓自己視野更加廣博。僅是自修閉門造車進步很慢、常常會落掉進度、而且頗為苦悶。有人帶領比較不會走偏方向,同時還能學到許多有趣的東西。
將 R 當玩具:如果學 R 如同遊戲一般好玩,那就沒有堅不堅持的問題了,這也是我自認學 R 相當成功的地方。以下,我將介紹一些我知道的有趣資源,不見得直接與資料分析相關,但一定可與 R 結合。
R Graph Gallery 、htmlwidgets for R : R 最為吸引人的特徵之一就是其強大的繪圖功能,加上其它套件的擴充,幾乎所有跟資料有關的圖都可以用 R 畫。沒事多多欣賞其他人用 R 畫出的圖,不僅療癒放鬆,同時對 R 的能力有個大概的想像、未來更有可能會有使用需求。
R Markdown : 先前提過 R Markdown 很強大,可以點進 gallery 感受一下其生產力。我認為不會用 R Markdown 比起不會用 R 還要可惜。
透過追蹤 R 社群是一個讓自己跟上快速成長的 R 的好方法,讓自己每日都長一些知識。例如,我透過臉書追蹤 R bloggers,裡面常出現優質好文,且內容通常清楚易讀。
另一個讓 R 功力快速成長的方式,就是自己成為 R bloggers:我不是指寫的文章要登上 R bloggers,而是像那些作者一樣在部落格上寫文章。寫文章是一種很好的學習方式,能幫自己重新組織所學,同時也可檢視是否真正了解正在撰寫的主題。文章不見得是寫給別人看的,有時忘記一些東西,透過自己的文字重新學習相當方便。推薦兩篇簡短的優質文說明寫 blog 的好處:Yihui Xie 、David Robertson。