Shiny

R语言app构建

Posted by CHY on June 27, 2020

Shiny用于开发交互式web应用。
Shiny应用程序分为两个部分:用户界面定义和服务端脚本。
用户界面是在源文件ui.R中定义。
服务端脚本在server.R中定于。
shiny手册1 shiny手册2

# 安装
install.packages("shiny")
library(shiny)
runExample("01_hello")  # 示例1
runExample("02_text")   # 示例2
runExample("03_reactivity") # 示例3

反应式设计

Shiny的web框架从本质上说是使从页面中获取输入值并传递给R变得更容易,然后把R代码的结果以输出值的形式返回给页面。
input values => R code => output values

反应式编程基础

反应式编程是种编程风格,这种风格以反应值开始,反应值是随时间变化的值,或者由用户输入的值,在反应值之上绑定有反应表达式(reactive expression),反应表达式会接收到反应值并执行其他反应表达式。

构建shiny应用流程

  1. 新建一个项目文件夹
  2. 在文件夹中编辑app.R(包含ui和server,使用shinyapp直接生成即可)
  3. 使用runApp启动应用
  4. 使用ctrl+c关闭应用

shiny网页布局

  1. fluidPage: 它的作用和其命名一致,就是创建一个流动布局的页面。
  2. titlePanel: 标题栏
  3. sidebarLayout: 常用的边栏布局,接受如下两个函数作为输入
    • sidebarPanel 边栏
    • mainPanel 主体部分 对应使用html语言进行网页设计
      ui <- fluidPage(
        titlePanel("title Panel"),
        sidebarLayout(
       sidebarPanel("sidebar"),
       mainPanel("main panler")
        )
      

增加小控件

| 函数 | 插件功能 | | —- | —- | | actionButton | 操作按钮 | | checkboxGroupInput | 一组复选框 | | checkboxInput | 单个复选框 | | dateInput | 单个日期选择 | | dateRangeInput | 一组日期选择 | | fileInput | 文件上传A file upload control wizard | | helpText | 可添加到输入窗体的帮助文本 | | numericInput | 数字输入 | | radioButtons | 单选按钮 | | selectInput | 一个可供选择的框 | | sliderInput | 滑动条 | | submitButton | 提交按钮 | | textInput | 输入文本的字段 | 控件

交互式设计

创建一个交互式的输出,只需要两步

  1. 在用户界面中增加输出内容项(R object)
  2. 在server中告知Shiny如何响应输入生成输出
    • 使用output类函数指定UI中输出的位置
    • 使用render类函数构建输出的R对象
    • 输出的创建代码在{}中。

前两个参数分别是该控件的唯一ID和在网页中显示的名字,所有控件的前两个都是这两个参数。

# 以文本输入控件为例
library(shiny)

ui <- fluidPage(
  titlePanel("Hello Widgets"),
  sidebarLayout(
    sidebarPanel(h1("Please input your name"),
                 textInput("input1", label = "", value = "",
                           placeholder = "your name")),
    mainPanel(
      h1("Showing results")
    )
  )
)
server <- function(input, output, session) {
}
shinyApp(ui, server)
# 通过代码学习函数使用
library(shiny)

ui <- fluidPage(
  
  titlePanel("censusVis"),
  
  sidebarLayout(
    sidebarPanel(
      helpText("Create demographic maps with information from the 2010 US census"),
      selectInput("checkBox1", 
                  label = "choose a variable to display",
                  choices = list("A"=1,
                                 "B"=2)
      ),
      sliderInput("sliderInput", 
                  label = "Range of interest",
                  min = 0, max=100, value = c(0,100), step=10)
      
    ),
    mainPanel(
    )
  )
)

server <- function(input, output){
}

shinyApp(ui = ui, server = server)

交互式入门

交互式也就是指的是能够通过选择然后直接输出对应的结果。
创建一个交互式的输出,只需要两步

  • 在用户界面中增加输出内容项(R object)
  • 在server中告知Shiny如何响应输入生成输出
    ## 网页布局
    ui <- fluidPage(
    titlePanel("censusVis"),
      
    sidebarLayout(
      sidebarPanel(
        helpText("Create demographic maps with 
                 information from the 2010 US Census."),
          
        selectInput("var", 
                    label = "Choose a variable to display",
                    choices = c("Percent White", 
                                "Percent Black",
                                "Percent Hispanic", 
                                "Percent Asian"),
                    selected = "Percent White"),
          
        sliderInput("range", 
                    label = "Range of interest:",
                    min = 0, max = 100, value = c(0, 100))
        ),
        
      mainPanel(
      )
    )
    )
    
    # 在UI中增加R object
     mainPanel(
        textOutput(outputId = "selectVar")
      )mainPanel(
      )
    

    | 输出函数 | 作用 | | —- | —- | | dataTableOutput | 数据表 | | htmlOutput | 原始HTML | | imageOutput | 图片 | | plotOutput | 作图结果 | | tableOutput | 表格 | | textOutput | 文本 | | uiOutput | 原始HTML | | verbatimTextOutput | 文本 | 所有的的Output系列函数都需要有outputId参数,shiny根据这个参数确定输出内容的位置。

    # 编写构建输出object的代码
    # 具体如何展现输出则是需要一类render函数
    server <- function(input, output) {
    output$selectVar <- renderText({
      sprintf("Your selection is %s\n", input$var)
    })
    }
    

    | 渲染函数 | 输出 | | renderDataTable | DataTable | | renderImage | 图片(本地的静态文件) | | renderPlot | 作图结果 | | renderPrint | 任何可打印的输出 | | renderTable | 数据框,矩阵或其他类表格结构 | | renderText | 字符串 | | renderUI | Shiny Tag 对象或HTML |

  • 使用output类函数指定UI中输出的位置
  • 使用render类函数构建输出的R对象
  • 输出的创建代码在{}中。

在shiny应用中加载数据和脚本

https://zhuanlan.zhihu.com/p/23030390

使用shinyapp分享你的Shiny应用

https://www.jianshu.com/p/841c44039324

Mastering Shiny学习

书籍地址
shiny简单来说就是利用R语言实现网页功能,主要依赖于user interface和server。

install.packages(c(
  "gapminder", "ggforce", "globals", "openintro", "shiny", 
  "shinycssloaders", "shinyFeedback", "shinythemes", "testthat", 
  "thematic", "tidyverse", "vroom", "waiter", "xml2", "zeallot" 
))
# 创建shiny app目录及文件 app.R
# Rstudio File => New project => New Directory => Shiny Web Application
# Cmd/Ctrl + Shift + Enter 运行
# 添加UI组件
ui <- fluidPage(
  selectInput("dataset", label = "Dataset", choices = ls("package:datasets")),
  verbatimTextOutput("summary"),
  tableOutput("table")
)
# fluidPage() 布局
# selectInput() 输入函数,交互式输入
# verbatimTextOutput() 与 tableOutput() 输出函数,前面展示代码,后者展示表格
# 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
  })
}