Shiny用于开发交互式web应用。
Shiny应用程序分为两个部分:用户界面定义和服务端脚本。
用户界面是在源文件ui.R中定义。
服务端脚本在server.R中定于。
# 安装
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应用流程
- 新建一个项目文件夹
- 在文件夹中编辑app.R(包含ui和server,使用shinyapp直接生成即可)
- 使用runApp启动应用
- 使用ctrl+c关闭应用
shiny网页布局
- fluidPage: 它的作用和其命名一致,就是创建一个流动布局的页面。
- titlePanel: 标题栏
- 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 | 输入文本的字段 |
交互式设计
创建一个交互式的输出,只需要两步
- 在用户界面中增加输出内容项(R object)
- 在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
})
}