十個(gè)超級(jí)好用的R語言編程技巧,一般人絕不知道!
由于R語言生態(tài)系統(tǒng)內(nèi)容繁復(fù)并在不斷發(fā)展,人們往往容易忽視一些切實(shí)有用的知識(shí)。這些技巧往往非常簡(jiǎn)單,但對(duì)于完成工作有很大的幫助。
本文將介紹十個(gè)能夠讓R語言編程工作更加輕松的小知識(shí)。
1. switch函數(shù)
在if語句基于其他變量值來選定某個(gè)值時(shí),switch可以很方便地縮短if語句。這個(gè)技巧在編程中需要根據(jù)之前的抉擇加載一個(gè)不同的數(shù)據(jù)集時(shí)非常有用。比如說,現(xiàn)在有一個(gè)變量“animal”,編程需要根據(jù)animal是dog,cat還是rabbit來加載一個(gè)不同的數(shù)據(jù)集。利用switch函數(shù),可以輸入以下代碼:
- data <-read.csv(
- switch(animal,
- "dog" ="dogdata.csv",
- "cat" ="catdata.csv",
- "rabbit" ="rabbitdata.csv")
- )
當(dāng)需要根據(jù)一個(gè)或多個(gè)輸入菜單選擇在Shiny應(yīng)用程序中加載不同的數(shù)據(jù)集甚至環(huán)境文件時(shí),這個(gè)技巧非常有用。
2. RStudio快捷鍵
和R hack軟件系統(tǒng)相比,RStudio IDE(IntegratedDevelopment Environment,集成開發(fā)環(huán)境)中更常用到這一類技巧。這些常用命令的快捷鍵非常有用,可以節(jié)省很多敲鍵盤的時(shí)間。比如Ctrl+Shift+M(用于管道操作符%>%)和Alt+-(用于賦值運(yùn)算符<-)兩個(gè)快捷鍵。想要了解更多方便好用的快捷鍵,可以在RStudio中輸入Atl+Shift+K查看。
3. flexdashboard包
如果想要?jiǎng)?chuàng)建一個(gè)能快速啟動(dòng)和高效運(yùn)行的Shiny儀表盤,可以選擇flexdashboard。這個(gè)包提供簡(jiǎn)單的HTML快捷方式,可以簡(jiǎn)化側(cè)邊欄創(chuàng)建和構(gòu)建行列展示。還有超級(jí)便捷的標(biāo)題欄,可以把應(yīng)用程序編譯到不同的頁面,以及把圖標(biāo)和鏈接放入Github代碼和郵件地址等。
由于flexdashboard包基于RMarkdown進(jìn)行操作,它允許把所有應(yīng)用程序放在一個(gè)Rmd文件中,而不必像shinydashboard那樣把程序分成獨(dú)立的服務(wù)器和UI(User Interface,用戶界面)文件。在需要?jiǎng)?chuàng)建一個(gè)簡(jiǎn)單的儀表盤初始版本并將其并入更高級(jí)的設(shè)計(jì)版本時(shí),flexdashboard包十分好用。利用flexdashboard包可以在一個(gè)小時(shí)內(nèi)啟動(dòng)和運(yùn)行儀表盤。
4. R Shiny中的req函數(shù)和validate函數(shù)
R Shiny常常讓人崩潰,特別是在彈出一般性錯(cuò)誤提醒而程序員又一頭霧水的時(shí)候。隨著Shiny的發(fā)展,越來越多的驗(yàn)證函數(shù)和測(cè)試函數(shù)加入了Shiny,幫助程序員更好地診斷和提醒錯(cuò)誤。
當(dāng)操作環(huán)境中沒有其他變量時(shí),req()函數(shù)可以悄無聲息地阻止一個(gè)操作的發(fā)生,并且不彈出錯(cuò)誤提醒。程序員因而可以在此前的操作中有條件地展示UI元件。以第一個(gè)小技巧中提到的例子為例:
- 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()函數(shù)則可以在輸出結(jié)果前進(jìn)行檢查。如果某個(gè)條件沒有滿足,特定的錯(cuò)誤提醒會(huì)彈出。比如說當(dāng)用戶上傳了錯(cuò)誤的文件時(shí):
- # 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. 利用系統(tǒng)環(huán)境保密所有憑證
如果在分享代碼時(shí),設(shè)置了數(shù)據(jù)庫登錄憑證或類似的設(shè)置,可以利用系統(tǒng)環(huán)境,防止憑證被上傳到Github或其他地方造成代碼泄露。可以把這些憑證作為命名環(huán)境變量放在R session中。比如:
- Sys.setenv(
- DSN = "database_name",
- UID = "User ID",
- PASS = "Password"
- )
這些環(huán)境變量可以用來登錄分享的腳本。比如:
- db <-DBI::dbConnect(
- drv = odbc::odbc(),
- dsn = Sys.getenv("DSN"),
- uid = Sys.getenv("UID"),
- pwd = Sys.getenv("PASS")
- )
更加簡(jiǎn)便的是,如果頻繁使用某些憑證,可以在操作系統(tǒng)中把它們?cè)O(shè)置為環(huán)境變量。如此,用R語言系統(tǒng)工作時(shí),便無需在代碼中輸入就可以隨時(shí)使用這些憑證。(注意有憑證權(quán)限的人。)
6. styler自動(dòng)生成tidyverse風(fēng)格
界面上有很多代碼,然而它們并不像你想要的那樣整潔,你也沒有時(shí)間進(jìn)行多線編輯。不要擔(dān)心。styler包有多個(gè)函數(shù)可以自動(dòng)編輯代碼,生成tidyverse風(fēng)格。只需要簡(jiǎn)單地運(yùn)行styler::style file(),它就會(huì)完成大部分(并不是所有)的工作。
7. 參數(shù)化R Markdown文件
當(dāng)你分析了一大堆關(guān)于狗的事實(shí)并寫完一個(gè)滿意的R Markdown文件時(shí),你被告知,“我還是對(duì)貓更感興趣”。這要怎么辦呢?不要擔(dān)心。如果參數(shù)化了R Markdown文件,只要通過一個(gè)命令,就可以自動(dòng)生成一份相似的關(guān)于貓的報(bào)告。
具體來說,需要在R Markdown文件的YAML標(biāo)頭中設(shè)置參數(shù),并給每個(gè)參數(shù)賦值。比如:
- ---
- 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寫進(jìn)文件中就可以了。如果正常轉(zhuǎn)換文件,那么每個(gè)參數(shù)就會(huì)被設(shè)置成默認(rèn)值。但是,如果在轉(zhuǎn)換文件選擇參數(shù)時(shí),選擇了RStudio中Knit下拉列表中的選項(xiàng)(或使用了kint_with_parameters()函數(shù)),一個(gè)菜單就會(huì)出現(xiàn),來在轉(zhuǎn)換文件前選擇參數(shù)。非常棒!
參數(shù)轉(zhuǎn)換
8. revealjs包
revealjs包內(nèi)嵌R代碼,可以使用直觀的幻燈片導(dǎo)航菜單在HTML中創(chuàng)建賞心悅目的演示文稿。它可以在R Markdown中使用,并有非常直觀的HTML快捷方式,可以創(chuàng)建具有嵌套和邏輯結(jié)構(gòu)的各種風(fēng)格的漂亮幻燈片。HTML格式的演示文稿也意味著人們?cè)诼犙葜v時(shí)可以繼續(xù)使用平板電腦或手機(jī)。這真的很方便??梢酝ㄟ^安裝包并在YAML標(biāo)頭中調(diào)用來設(shè)置一個(gè)revealjs演示文稿。下面展出了使用revealjs做的一個(gè)演講的YAML標(biāo)頭。
- ---
- 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標(biāo)簽(以在Shiny應(yīng)用程序中播放音頻為例)
R Shiny中有110種HTML標(biāo)簽,可以為各種各樣的HTML命令,如格式化,提供快捷方式。然而,大部分人都沒有充分利用這些標(biāo)簽。比如創(chuàng)建了一個(gè)shiny應(yīng)用程序,該程序在執(zhí)行某個(gè)任務(wù)時(shí)需要花費(fèi)大量的時(shí)間。用戶希望在等待完成該任務(wù)的過程中,能夠執(zhí)行其他的多項(xiàng)任務(wù),所以可以利用tags$audio這一標(biāo)簽,讓該應(yīng)用程序在完成任務(wù)時(shí)播放勝利號(hào)角來提醒用戶。
10. praise包
praise包具有極其簡(jiǎn)單但十分有用的功能,即贊美用戶。盡管這一功能看起來是毫無意義的自我贊賞,它實(shí)際上發(fā)揮著巨大的作用。它可以在用戶成功地完成一個(gè)任務(wù)時(shí),對(duì)用戶進(jìn)行贊美或鼓勵(lì)。程序員也可以把這個(gè)包放在已完成的腳本的最后,在程序順利運(yùn)行之后享受它帶來的幸福瞬間。
praise包