由于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包