Yongfu's Blog

我的 R 學習歷程

Jan 31, 2018

接觸 R 的時間大約五個月了,從原本對電腦、程式一竅不通到現在能有效率的 debug、寫出簡潔有條理的 R code、甚至用 R 與 Markdown 架站寫部落格。算一算,我每週通常至少 3 天會用到 R,不是督促自己熟悉 R,是因為它太有魅力了。

學 R 語言很有趣1,但也相當耗時耗力。我在學習 R 上花了大量的時間,若不是運氣好找到對的方向,我不可能花費那麼多力氣去學 R,甚至可能直接放棄。雖然如此,我還是感到有點可惜,若能更早知道有效率的學習方式,就不必花費如此大量的時間 (及紙張) 在學習上。因此,我希望將學習 R 的心路歷程寫下,給想學 R 的人做為參考,或許可以減短學習初期耗費精神的時期。接下來,我將說明:

  1. 我學習 R 的動力來源

  2. R 學習路徑:若從頭來過,我會如何學習 R、挑選哪些資源,讓自己更有效率地學習。

為何我能持續學習 R 而未放棄?其實現在我比較頭大的問題是:要怎麼克制自己不要一直打開 Rstudio?正是因為我學 R 的過程如同打電動一樣歡樂,所以放棄這個問題根本不存在。但事實上,剛開始學 R 時並不如何歡樂,直到上了課才越來越喜歡 R。

課程回顧

106學年上學期,我最喜歡、也意外收穫最多的課是謝舒凱老師開設的 R 語言與資料科學導論,或許會是我大學生涯最喜歡的課吧。

起初是抱著學好 R 語言 (加上通識快修不完) 的心情去加簽這門課的,但課堂上 R 語言的語法卻教得不多。然正是這種不聚焦在程式語法的課程安排,讓我把 R 學得非常好。如果課程從頭到尾都在教 R 語言,到期末我一定會受不了越顯複雜的語法,最後便隨意敷衍了事。我在這門課收穫最大的,反而不是課堂學到的技巧,而是老師、助教們傳達的一些概念與想法,以及自己探索這些概念想法的樂趣與收穫:

  • Open Source2 以及 R 的生態圈3

  • 資料科學與 Story telling: Coding 於資料科學中的應用,不僅是傳統所強調的功能性,Coding 亦於美觀及呈現上扮演重要的角色。資料科學透過 Coding 處理、分析資料;同時也透過 Coding 作圖將資料視覺化,好將資料科學上的發現說成故事給其他人聽

  • 文本分析: 我本來對這部分最沒有興趣,直到我意識到文本資料是研究人類行為、社會與文化最重要的資料來源之一4 5

  • Reproducibility: R Markdown (.Rmd) 是我見過最強大的文件格式,可以輸出成網頁、投影片、PDF、Word、Markdown 等。這讓使用者可以在一份文件中做事情 (Rmd),並依據所需輸出成各種文件,而不用剪剪貼貼 (從 Word 貼到 PPT),也省下排版所花費的心力。例如,要報告可輸出成投影片 (.html.pptx) 、要列印可輸出成 PDF、要放到網路上可輸出成網頁。R Markdown 讓使用者能以簡單有效率的方式工作,這是達到 Reproducibility 的前提與重要基礎。

    Reproducible Research with R
    Reproducible Research with R
    6

課程起手式

這門課與我個性相符,完全顯現在第一堂課實習課 (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套件處理資料。之後隨著時間,自然而然就會熟悉這兩者。

維持

學習一項新技能最困難的地方大概是要能持續穩定前進。我認為有幾種方法可以幫助自己:

  1. 參考書:一本好的參考書,能作為一個參照指標,幫助自己安排進度,也讓自己知道學到了哪裡。參考書指出了一條方向,比較不會在學習的路途中迷失 (相比零散的網路資源)。

  2. 修課:我非常建議在學校修一門 R 語言的課 (最好 3 學分以上),但不建議線上課程16。修課的話,有老師和助教提供經驗,能省下許多摸索的時間;每週有固定進度,或多或少可迫使自己持續接觸程式;若有期末專案,這會是 R 功力突飛猛進的最佳機會 (效果比起純粹練習好太多)。

  3. 讓自己喜歡 R:初學 R 時因為不知道這項的重要性,所以學得有點辛苦。這點真的很微妙,有時候太過專注於學習某項"技能",反而會過於專注實用性而忽略了趣味性,於是只剩理性說服自己:學這很有用,你一定要堅持下去。通常開始這樣想,代表離放棄不遠了。這也是為何我很推 R 語言與資料科學導論 這門課的原因 ─ 老師真的很有智慧,不斷鼓勵學生們去想有趣又可用資料科學回答的問題,也常介紹一些 R 意想不到的有趣應用,但從未將焦點放在程式的硬實力上。我自己由 R 善於視覺呈現的特質切入 – 從 R Markdown 開始,擴展到資料視覺化,又到網頁設計 (縱使我htmlcss基礎很差),每一項對我來說都非常有趣,R 學起來因而樂此不疲。

實作:專案

看再多參考書、修再多課、做再多練習題都比不上實際去完成一個專案。在實作專案的過程中,會遇到一缸子自己不知如何解決的問題,因此過程中就是在不斷吸收新知識、學習如何問問題17,如此的學習效果是零散練習題的好幾倍。此外,做專案是自頭至尾走過一次資料科學的流程,從爬資料、整理、分析到呈現,將先前習得的零碎技巧組織在一起,會讓 R 的功力大增;同時,資料科學專案是在實際解決 (回答) 一個問題,這不僅對於自己,且對於社會有實質的意義與價值。

對於專案的一些建議

我認為要從實作專案收穫那麼多,不可或缺的因素同樣是興趣與熱情。沒有這些一定不可能堅持完美,不能堅持完美,專案就會淪落為練習題 (反正只要跑出東西就好)。題目的選擇因而會是成敗的關鍵;與組員 (若為團體專案) 的溝通與共識更是關鍵中的關鍵,一定要在專案中找到最適合自己的角色,否則專案只是浪費時間。

學習資源

起初為了學 R 所印的兩本書以及聽的線上課程效果頗糟,讓我覺得自己起步不算順遂。這是因為當時對 R 不太了解,也不知如何觸及其社群,因而並未慎選書籍及課程即步入學習歷程。

學習歷程

若回到五個多月前,我會如此安排 R 的學習歷程:

  1. 基礎參考書 (若有餘力的話 + swirl18 當練習題)

    • 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套件)。
  2. 學校課程:如課程回顧所提及,一門 R 的課可以讓自己視野更加廣博。僅是自修閉門造車進步很慢、常常會落掉進度、而且頗為苦悶。有人帶領比較不會走偏方向,同時還能學到許多有趣的東西。

  3. 將 R 當玩具:如果學 R 如同遊戲一般好玩,那就沒有堅不堅持的問題了,這也是我自認學 R 相當成功的地方。以下,我將介紹一些我知道的有趣資源,不見得直接與資料分析相關,但一定可與 R 結合。

    • R Graph Galleryhtmlwidgets for R : R 最為吸引人的特徵之一就是其強大的繪圖功能,加上其它套件的擴充,幾乎所有跟資料有關的圖都可以用 R 畫。沒事多多欣賞其他人用 R 畫出的圖,不僅療癒放鬆,同時對 R 的能力有個大概的想像、未來更有可能會有使用需求。

    • R Markdown : 先前提過 R Markdown 很強大,可以點進 gallery 感受一下其生產力。我認為不會用 R Markdown 比起不會用 R 還要可惜。

    • Blogdown : 我目前的網站 (一部份) 是透過 blogdown 套件在經營19的。Blogdown 大幅降低了架站的門檻,即使完全不懂 HTML/CSS 也能快速上手,同時配合 Git/GitHub 能讓發表 (及修改) 文章的過程非常有效率。此外,以 blogdown 架設的網頁是靜態的,不同於 Wordpress 等的動態網頁,靜態網頁的速度要快許多、不需要付費伺服器,而且容易搬遷。

  4. 集大成:專案製作

    • 實作:專案所述,專案是讓自己快速進步的最佳方案。同時,結合上述的學習資源:

      • 資料分析:R for Data Science

      • 視覺化:R Graph Gallery, htmlwidgets

      • 網頁製作:R Markdown, Blogdown

    • 這些都可以透過 R 完成,並且讓自己更有動機實作專案、讓專案看起來更完美。

更上一層樓:Following and Followers

Following and Followers 是我直接借用 GitHub 上的用詞:

  • Following: 該用戶追蹤的其他用戶

  • Followers: 追蹤該用戶的其他用戶

透過追蹤 R 社群是一個讓自己跟上快速成長的 R 的好方法,讓自己每日都長一些知識。例如,我透過臉書追蹤 R bloggers,裡面常出現優質好文,且內容通常清楚易讀。

另一個讓 R 功力快速成長的方式,就是自己成為 R bloggers:我不是指寫的文章要登上 R bloggers,而是像那些作者一樣在部落格上寫文章。寫文章是一種很好的學習方式,能幫自己重新組織所學,同時也可檢視是否真正了解正在撰寫的主題。文章不見得是寫給別人看的,有時忘記一些東西,透過自己的文字重新學習相當方便。推薦兩篇簡短的優質文說明寫 blog 的好處:Yihui XieDavid Robertson

小結

我真的很慶幸能在大三時接觸到 R。以往我都把時間花在讀書上,也不知何時才能用得上。R 讓我發現了自己的嗜好20,也讓我體驗到為了處理想解決的問題而學習的感覺。我也才慢慢體會到為了興趣所學與為了其它目的 (競爭力、考試、學分、跟風?) 所學,能帶來的可觀差異。當然,興趣與其它目的並非不能同時存在,只是有時專注在其它目的會抑制興趣,而最能讓學習持續的動力來源卻是興趣。

這篇文章的目的,旨在提供有志學 R 卻不確定如何開始的人作參考。文章介紹的學習資源 (或是任何嘮叨的內容),不只是 (我認為) 有用的,且能強烈引起我的興趣。希望讀過這篇文章的人,不僅僅獲益於文章介紹的學習資源,且能為了興趣而學 R ─ 這是此篇文章最想傳達的想法。



  1. R 語言本身不算有趣,而是 R 及其生態圈所能做到的事。幾乎任何想得到、可用電腦處理的事情,都可找到相關的 R 套件。 ↩︎

  2. 我覺得 Open Source 是一個很強盛且很令人感動的文化。其展現了透過分享與合作,人們能夠創造出多少美好的事物。 ↩︎

  3. 我常在想,不知何時 SASSPSS 會被 R 幹掉。由於 SAS 與 SPSS 是私人版權軟體,在網路上的社群資源相當稀少且日漸縮小 (問問題找不到答案),而 R 社群巨大且快速成長,加上其開放的特性,功能的擴充與成長是 SAS 與 SPSS 等封閉軟體無法企及的。 ↩︎

  4. 至少是資訊量最大的資料來源,比較看看社群網站、網路、書籍 (見 Google Ngram,體驗一下文本資料的強大) 累積的資料量與心理學實驗累積的資料量。 ↩︎

  5. 語言學不僅可用於研究語言、還可拿來當作研究人類社會與文化的工具。 ↩︎

  6. 圖片擷取自 British Ecological Society 編寫之指南 A Guide to Reproducible Code ↩︎

  7. 我本來對美感、簡約、使用者經驗完全不在乎,但受我好朋友的影響,越來越在意這些東西 (看到乾淨舒服的版面就會很興奮,有點點不和諧就會想修改它)。 ↩︎

  8. R Markdown 了解其強大。 ↩︎

  9. Markdown 的學習門檻很低,使大家能簡單地寫出排版整潔漂亮的文章。R Markdown 大幅擴充 Markdown 的功能,秉持著相同的精神,R Markdown 使大家能簡單地寫出排版整潔漂亮 (且含有R跑出之圖表) 的文章投影片書籍,甚至網站。 ↩︎

  10. 例如欲繪製時間序列的資料ggplot2dygraphs對資料就有不同的要求。 ↩︎

  11. 我在開學前的暑假即開始自學 R,進步相當緩慢,而且語法時常忘記。最重要的是,我必須花心力督促自己才能繼續。開學後在課堂上教導的內容不多,僅做些簡單的介紹,剩下的要靠自己發掘。由於深深感受到 Markdown 的潛力 (見課程起手式,我開始「不務正業」,去學一些和 R (看似) 不怎麼相關的東西 (例如,研究如何用 GitHub Pages 架部落格),也越來越喜歡 html 格式 (以前偏愛 PDF,但發現 html 能呈現的東西比 PDF 多太多,又比較美觀)。於是,R 成為我處理作業最常使用的程式之一。 ↩︎

  12. R 除了函數非常多,使用起來也非常彈性,對使用者的限制相當少:其它語言很容易跑出 error message,但在 R 卻相對不容易 (例如,輸入c (1, 2, "c") 不會跑出 error 但會將1, 2數字轉換成字串)。這對初學者不見得是好事:初學者常因此難以釐清 R 運作的邏輯。 ↩︎

  13. 精通 R 應該可算是一輩子的事吧,因為 R 是個不斷在成長的語言。R 的社群與生態圈成長非常迅速 (例如,目前 CRAN 有 12,081 個 package),要精通 R 勢必要與它一起成長。即使只求在傳統的資料分析上熟悉 R,也需要花不少的時間,而且很難在短時間內大幅進步。 ↩︎

  14. 這裡把 R 說得有點負面。當 R 融入你生活中,你喜歡它都來不及了 (不論是它讓你做事更有效率或它能做出很厲害的東西),根本就沒有支撐學習的問題,只有時間不足的問題。 ↩︎

  15. 一定的基礎:了解 R 的向量式運算邏輯資料結構 (vector, list, matrix, dataframe) 、熟悉 Subsetting (object[index])。見學習資源了解更多。 ↩︎

  16. 我覺得學習任何東西,如果有實體 (面對面) 的課程,都比線上課程還好。我自己很難集中注意力在線上課程,加上時間太自由容易怠惰,或有事情時就會將其順位往後挪,因此成效往往不彰。 ↩︎

  17. 在網路上要輸對關鍵字才找得到答案。起初由於不清楚 R 的運作邏輯,找答案的效率會很低。但隨著功力提升,會越容易知道問題的癥結在哪,找答案 (或是確認問題能否被解決) 也會變得更有效率。 ↩︎

  18. swirl 是 R 的套件,可以讓使用者直接在 R 的環境中互動式學習 R。其提供許多課程可供使用者下載,我覺得學完最基礎的課程就夠了,可以熟悉 Base R 的環境。詳細的課程見 swirl course。 ↩︎

  19. 我是在逛 bookdown.org 的書時,無意間發現 Blogdown 的書,可惜當時我早已用 Jekyll / GitHub Pages 架好網站。Jekyll 的使用門檻相當高,我也並未學會如何使用 (我直接用別人做好的模板,因此只要修改一些.html.css)。反之,blogdown支援的 Hugo 並沒有 Jekyll 那麼多的限制。blogdown同時大幅降低了架站的難度,例如,blogdown支援的 Markdown 語法 (Pandoc Markdown) 很豐富且很適合寫部落格,因此用其寫部落格就不必理會 Jekyll 或 Hugo 等網頁產生器所支援的特定 Markdown 語法 (Jekyll 支援kramdown、Hugo 支援blackfriday)。 ↩︎

  20. 大學以前,我很排斥程式 (詳見此文)。後來發覺程式的實用性而開始想學程式語言。學了 R 後發現自己其實有資工魂 (雖然 CS 領域似乎不常用 R ?),其實很喜歡程式語言、電腦等東西。 ↩︎