寫出漂亮的R程式碼

就像文章會有固定的寫法,程式語言也是,練習寫得簡潔易讀,是需要多加練習的,可以參考Hadley Wicham在Advance R裡寫關於寫作style的建議,另一個則是google 的 R style rule。整體來說是很簡單的。

分成以下幾類來改善R code 的撰寫:

  • 檔案名稱
    • 將檔案名稱以底線連接,且最好檔名要讓人一眼知道裡面是什麼
      • 好的命名
        • predict_ad_revenue.R
      • 壞的命名
        • foo.R
  • 變數(identifiers)的名字
    • 可以分成兩種,函數的名稱或是其他一般的變數名稱
      • 一般變數:盡量不要用底線連接,而是用逗點來連接
        • 好的命名
          • variable.name
        • 壞的命名
          • variable_name
      • 函數名稱:加入大寫,不要用逗點或是底線
        • 好的命名
          • CalculateAvgClicks
        • 壞的命名
          • calculate_avg_clicks
  • 每行的長度
    • 不要超過80個字碼
  • 縮進(indentation)
    • 不要混用tab和space,最好的方式是使用 2 spaces
  • 空白格(spacing)
    • 在所有運算符號前面加上一個空白格如(=+<-..etc.)

R Shiny 快速使用R搭建app應用

Rstudio 開發的shiny基本架構

Shiny application是一款以R語言為框架,可以快速且方便搭健application,當幫忙使用R寫完清理或是視覺化資料後,最重要的是如何讓不懂R語言的人也可以享受,此時,用RStudio開發的Shiny框架便能快速有這效果,且其跟Rstudio整合得非常好,貼心宜人,即使非寫網頁應用程式出生的生物學家,只要略懂R語言,便能完成!

screenshot.png

shiny語法有非常詳細的解說,且搭配實例,只要到官方網頁就可以瀏覽,大概一兩個小時就可以了解他的架構,最棒的事其可以跟html / javascripts等等串接在一起,做出更多的效果!

做好的application可以直接使用Rstudio裡頭的快捷鍵發佈到shinyapp的網路平台,其提供後台完整的服務,付費的話可以獲得更佳的效能,但免費版已經可以玩得很開心了!

screenshot.png

 

點擊寫好的code,便能直接deploy到shinyapps的平台,一條龍服務!

screenshot.png

基本上,shiny的概念,就是直接用R code搭建網站的前端(ui.R)和資料處理的後端(server.R),server的code會處理由ui端或是使用者輸入的資料,處理後再丟回給ui!

R package: dplyr 無痛分析dataframe

在R裡面處理數據前處理時,dplyr 是非常強大的一個封包,其主要設計的理念有三個:

  1. 整合所有在前處理數據會常用的“邏輯”,變成簡單易懂的函數,比如:過濾特定行、針對特定行資料作出彙整等等。
  2. 底層使用c++撰寫,讓其處理時速度較快
  3. 其在“輸入”的檔案支持性良好,支持多種資料庫的串接

dplyr是由Hadley Wickham開發的,承接plyr的邏輯。語法上加入pipeline的概念,可以寫得非常精簡。

dplyr package 最重要的5個函數,其實就代表在資料前處理的普遍操作

  • select
    • 挑選特定column出來
  • filter
    • 自訂條件濾掉column中的資料
  • arrange
    • 調整row排列順序
  • mutate
    • 以現有的column資料做運算,形成新的column
  • summarise
    • 將目前的資料做統計運算,形成統計結論

當然新版本的dplyr其實會把輸入的檔案,轉換成tbl/tibble的格式,在資料呈現和內建的處理邏輯會有些不同,可能要小心,這邊寫其中一個用原生data.frame處理邏輯轉入到使用dplyr可能會遇到的。隨者使用tidyverse的包越來越多,會發現Hadley Wickham有一套很棒的計畫在逐漸把R原生的"較不直覺的"語法改進。

以下分別示範在dplyr中這幾個用法:

使用常用的mtcars資料集做示範:

select

data("mtcars")
mtcars %>% str()

這筆資料由Motor Trend US 雜誌所提供,總共有32部介於1973-74年出產的汽車其性能的資訊。

screenshot.png

screenshot.png

Select :挑選特定欄位進行分析,其利害的地方其實是這個函數的子函數:

  1. starts_with() 挑選欄位名稱開頭有""字串的欄位
  2. ends_with()   挑選欄位名稱結尾有""字串的欄位
  3. contains()       挑選欄位名稱中包含""字串的欄位
  4. matches()       挑選欄位名稱符合""字串的欄位
select(mtcars, starts_with("m"))
select(mtcars,  ends_with("b"))
select(mtcars, contains("ra"))
select(mtcars, matches("a"))
select(mtcars, disp, am)

Filter: 根據特定條件篩選資料
filter的使用就蠻直覺的,可以直接在後面接logical條件,且可以直接使用欄位名稱


filter(mtcars, cyl == 8)
filter(mtcars, cyl < 6)

# Multiple criteria
filter(mtcars, cyl < 6 & vs == 1)
filter(mtcars, cyl < 6 | vs == 1)

# Multiple arguments are equivalent to and
filter(mtcars, cyl < 6, vs == 1)

這邊整理filter可以使用的一些“logic”表示法

Logic symbol
== 等於
!= 不等於
> 大於
< 小於
%in% 包含於
is.na() 是否為NA值

Arrange: 將資料根據特定欄位來排序
預設是將數值由小到大排下去,假如有NA值的話,直接排最後,使用desc則變成由大到小,其本身支持multiple arrange


arrange(mtcars, cyl, disp)
arrange(mtcars, desc(disp))

Mutate:由已有的行經過“處理(加減乘除等等)”,產生新的行

mutate(mtcars, displ_l = disp / 61.0237)

Summarise:總結行資料,形成單一值
summarise的函數,可能是需要多點練習,才會比較熟稔他的邏輯,其就是將資料進行sum, mean, median等等,原本r語言中,用來進階統計內建函數可以上場的時候。

summarise(mtcars, mean(disp))
summarise(group_by(mtcars, cyl), mean(disp))
summarise(group_by(mtcars, cyl), m = mean(disp), sd = sd(disp))

其實除了這五個基本函數外,dplyr封包中有很多進階的功能,可以進一步來活用!

這邊有Rstudio精心整理的cheat sheet,可以用來幫助學習