十個超級好用的R語言編程技巧,一般人絕不知道!
由于R語言生態系統內容繁復并在不斷發展,人們往往容易忽視一些切實有用的知識。這些技巧往往非常簡單,但對于完成工作有很大的幫助。
本文將介紹十個能夠讓R語言編程工作更加輕松的小知識。
1. switch函數
在if語句基于其他變量值來選定某個值時,switch可以很方便地縮短if語句。這個技巧在編程中需要根據之前的抉擇加載一個不同的數據集時非常有用。比如說,現在有一個變量“animal”,編程需要根據animal是dog,cat還是rabbit來加載一個不同的數據集。利用switch函數,可以輸入以下代碼:
- data <-read.csv(
- switch(animal,
- "dog" ="dogdata.csv",
- "cat" ="catdata.csv",
- "rabbit" ="rabbitdata.csv")
- )
當需要根據一個或多個輸入菜單選擇在Shiny應用程序中加載不同的數據集甚至環境文件時,這個技巧非常有用。
2. RStudio快捷鍵
和R hack軟件系統相比,RStudio IDE(IntegratedDevelopment Environment,集成開發環境)中更常用到這一類技巧。這些常用命令的快捷鍵非常有用,可以節省很多敲鍵盤的時間。比如Ctrl+Shift+M(用于管道操作符%>%)和Alt+-(用于賦值運算符<-)兩個快捷鍵。想要了解更多方便好用的快捷鍵,可以在RStudio中輸入Atl+Shift+K查看。
3. flexdashboard包
如果想要創建一個能快速啟動和高效運行的Shiny儀表盤,可以選擇flexdashboard。這個包提供簡單的HTML快捷方式,可以簡化側邊欄創建和構建行列展示。還有超級便捷的標題欄,可以把應用程序編譯到不同的頁面,以及把圖標和鏈接放入Github代碼和郵件地址等。
由于flexdashboard包基于RMarkdown進行操作,它允許把所有應用程序放在一個Rmd文件中,而不必像shinydashboard那樣把程序分成獨立的服務器和UI(User Interface,用戶界面)文件。在需要創建一個簡單的儀表盤初始版本并將其并入更高級的設計版本時,flexdashboard包十分好用。利用flexdashboard包可以在一個小時內啟動和運行儀表盤。
4. R Shiny中的req函數和validate函數
R Shiny常常讓人崩潰,特別是在彈出一般性錯誤提醒而程序員又一頭霧水的時候。隨著Shiny的發展,越來越多的驗證函數和測試函數加入了Shiny,幫助程序員更好地診斷和提醒錯誤。
當操作環境中沒有其他變量時,req()函數可以悄無聲息地阻止一個操作的發生,并且不彈出錯誤提醒。程序員因而可以在此前的操作中有條件地展示UI元件。以第一個小技巧中提到的例子為例:
- output$go_button<- shiny::renderUI({
- # only display button if an animal input hasbeen chosen
- shiny::req(input$animal)
- # display button
- shiny::actionButton("go",
- paste("Conduct", input$animal, "analysis!")
- )
- })
validate()函數則可以在輸出結果前進行檢查。如果某個條件沒有滿足,特定的錯誤提醒會彈出。比如說當用戶上傳了錯誤的文件時:
- # get csv inputfile
- inFile <-input$file1
- data <-inFile$datapath
- # render table onlyif it is dogs
- shiny::renderTable({
- # check that it is the dog file, not cats orrabbits
- shiny::validate(
- need("Dog Name" %in%colnames(data)),
- "Dog Name column not found - did youload the right file?"
- )
- data
- })
5. 利用系統環境保密所有憑證
如果在分享代碼時,設置了數據庫登錄憑證或類似的設置,可以利用系統環境,防止憑證被上傳到Github或其他地方造成代碼泄露。可以把這些憑證作為命名環境變量放在R session中。比如:
- Sys.setenv(
- DSN = "database_name",
- UID = "User ID",
- PASS = "Password"
- )
這些環境變量可以用來登錄分享的腳本。比如:
- db <-DBI::dbConnect(
- drv = odbc::odbc(),
- dsn = Sys.getenv("DSN"),
- uid = Sys.getenv("UID"),
- pwd = Sys.getenv("PASS")
- )
更加簡便的是,如果頻繁使用某些憑證,可以在操作系統中把它們設置為環境變量。如此,用R語言系統工作時,便無需在代碼中輸入就可以隨時使用這些憑證。(注意有憑證權限的人。)
6. styler自動生成tidyverse風格
界面上有很多代碼,然而它們并不像你想要的那樣整潔,你也沒有時間進行多線編輯。不要擔心。styler包有多個函數可以自動編輯代碼,生成tidyverse風格。只需要簡單地運行styler::style file(),它就會完成大部分(并不是所有)的工作。
7. 參數化R Markdown文件
當你分析了一大堆關于狗的事實并寫完一個滿意的R Markdown文件時,你被告知,“我還是對貓更感興趣”。這要怎么辦呢?不要擔心。如果參數化了R Markdown文件,只要通過一個命令,就可以自動生成一份相似的關于貓的報告。
具體來說,需要在R Markdown文件的YAML標頭中設置參數,并給每個參數賦值。比如:
- ---
- title: "AnimalAnalysis"
- author: "KeithMcNulty"
- date: "21March 2019"
- output:
- html_document:
- code_folding: "hide"
- params:
- animal_name:
- value: Dog
- choices:
- - Dog
- - Cat
- - Rabbit
- years_of_study:
- input: slider
- min: 2000
- max: 2019
- step: 1
- round: 1
- sep: ''
- value: [2010, 2017]
- --
然后只需把這些變量用R語言,如params$animal_name和params$years_of_study寫進文件中就可以了。如果正常轉換文件,那么每個參數就會被設置成默認值。但是,如果在轉換文件選擇參數時,選擇了RStudio中Knit下拉列表中的選項(或使用了kint_with_parameters()函數),一個菜單就會出現,來在轉換文件前選擇參數。非常棒!
參數轉換
8. revealjs包
revealjs包內嵌R代碼,可以使用直觀的幻燈片導航菜單在HTML中創建賞心悅目的演示文稿。它可以在R Markdown中使用,并有非常直觀的HTML快捷方式,可以創建具有嵌套和邏輯結構的各種風格的漂亮幻燈片。HTML格式的演示文稿也意味著人們在聽演講時可以繼續使用平板電腦或手機。這真的很方便??梢酝ㄟ^安裝包并在YAML標頭中調用來設置一個revealjs演示文稿。下面展出了使用revealjs做的一個演講的YAML標頭。
- ---
- title:"Exporing the Edge of the People Analytics Universe"
- author: "KeithMcNulty"
- output:
- revealjs::revealjs_presentation:
- center: yes
- template: starwars.html
- theme: black
- date: "HRAnalytics Meetup London - 18 March, 2019"
- resource_files:
- - darth.png
- - deathstar.png
- - hanchewy.png
- - millenium.png
- - r2d2-threepio.png
- - starwars.html
- - starwars.png
- - stormtrooper.png
- ---
- 代碼傳送門:https://github.com/keithmcnulty/hr_meetup_london/blob/master/presentation.Rmd
- 演示文稿傳送門:http://rpubs.com/keithmcnulty/hr_meetup_london
revealjs助你輕而易舉完成線上演示文稿
9. R Shiny中的HTML標簽(以在Shiny應用程序中播放音頻為例)
R Shiny中有110種HTML標簽,可以為各種各樣的HTML命令,如格式化,提供快捷方式。然而,大部分人都沒有充分利用這些標簽。比如創建了一個shiny應用程序,該程序在執行某個任務時需要花費大量的時間。用戶希望在等待完成該任務的過程中,能夠執行其他的多項任務,所以可以利用tags$audio這一標簽,讓該應用程序在完成任務時播放勝利號角來提醒用戶。
10. praise包
praise包具有極其簡單但十分有用的功能,即贊美用戶。盡管這一功能看起來是毫無意義的自我贊賞,它實際上發揮著巨大的作用。它可以在用戶成功地完成一個任務時,對用戶進行贊美或鼓勵。程序員也可以把這個包放在已完成的腳本的最后,在程序順利運行之后享受它帶來的幸福瞬間。
praise包