Shiny学习笔记:简介

简介

Shiny app主要包括两个关键组件:

  • UI(user interface):定义app外观
  • server:定义app如何运行

创建

建议在Rstudio中运行。 先安装shiny包:

install.packages("shiny")
library(shiny)

有好几种创建Shiny app的方式,最简单的就是新建一个文件夹,在里面创建一个app.R文件,里面写入代码,定义app外观以及如何运行

library(shiny) #加载shiny包
ui <- fluidPage(
  "Hello, world!"
) #定义ui,这里是一个界面显示Hello, World!
server <- function(input, output, session) {
} #定义app如何运行,这里是空的,不做任何事情
shinyApp(ui, server) #创建并启动app

点击Rstudio中的Run App按钮,app就运行了,显示如下:

这样我们就创建了一个最简单的app了。

控件

控件可以让用户界面更丰富,下面我们添加一个选择控件, 将ui修改如下:

ui <- fluidPage(
  selectInput("dataset", label = "Dataset", choices = ls("package:datasets")),
  verbatimTextOutput("summary"),
  tableOutput("table")
)
  • fluidPage():布局函数,定义界面显示方式
  • selectInput():输入控件,用户可以提供输入值,这里是选择输入控件,用户可以选择包datasets中的数据集
  • verbatinTextOutput()以及tableOutput():输出控件

app运行之后显示如下:

设置服务端

上面app服务端一直是空白的,用户无论如何选择数据集,界面都没结果显示,下面我们添加部分服务端代码。shiny使用的是响应式编程,我们只是告诉shiny如何运行计算,不是让shiny直接去做,直白的说就是我们只是提供shiny食谱,不是让shiny直接做菜。

下面的小例子,我们告诉shiny如何填充输出部分,将server部分修改如下:

server <- function(input, output, session) {
  output$summary <- renderPrint({
    dataset <- get(input$dataset, "package:datasets")
    summary(dataset)
  })
  
  output$table <- renderTable({
    dataset <- get(input$dataset, "package:datasets")
    dataset
  })
}

基本上所有的输出都是下面的模式:

output$ID <- renderTYPE({
  # Expression that generates whatever kind of output
  # renderTYPE expects
})

output$ID对应于ui中设置的输出ID,必须一一对应,不然出错。render函数则是渲染我们提供的代码,这里renderPrint()打印出summary的结果,renderTable输出数据集。每一个render*函数对应于一种特定的输出,上面的renderPrint()捕获并显示数据集的信息,renderTable()则是直接显示该数据集。

运行上面的app,显示界面如下:

由于是响应式编程,所以一旦我们选择不同的数据集,输出结果自动变换,比如我们选择另外一个数据集,结果就不同:

精简代码

即使是上面这样最简单的app,我们发现是还是存在重复的脚本:

dataset <- get(input$dataset, "package:datasets")

重复代码对于app的运行、维护、资源都是一种负担,在shiny中我们尽量使用响应表达式(reactive expression)来精简代码。reactive expressionreactive({})封装代码并赋值给一个变量,它只在启动app的时候运行并将结果缓存,将server修改如下:

server <- function(input, output, session) {
  dataset <- reactive({
    get(input$dataset, "package:datasets")
  })

  output$summary <- renderPrint({
    summary(dataset())
  })
  
  output$table <- renderTable({
    dataset()
  })
}

可以看到dataset我们只获取了一次,但是使用了两次,值得注意的是一旦变量经reactive({})之后,变量后面作为一个函数一样使用。

这里只讲了一些很简单的控件,实际上shiny存在十分丰富的控件,RStudio提供了一份 shiny小抄,大家可以打印出来,没事的时候看看。

参考:https://mastering-shiny.org/basic-app.html

Researcher

I am a PhD student of Crop Genetics and Breeding at the Zhejiang University Crop Science Lab. My research interests covers a range of issues:Population Genetics Evolution and Ecotype Divergence Analysis of Oilseed Rape, Genome-wide Association Study (GWAS) of Agronomic Traits.

comments powered by Disqus