shiny | 使用R创建一个网页应用(Web App)
借助shiny
工具包可以使用R代码创建网页App(Web Application)。在RStudio的官网上,还提供了一套基础的学习手册,共7节课程[1]和4个练习项目[2],详见链接:https://shiny.rstudio.com/tutorial/#get-started:
课程链接:https://shiny.rstudio.com/tutorial/written-tutorial/lesson1/
练习链接:https://rstudio-education.github.io/shiny-course/
1 简介
1.1 一般流程
使用shiny
工具包创建网页App有一套模板化的流程:
首先,创建一个本地文件夹,之后所有相关文件如R代码、数据都放置在该文件夹内;
第二,从Rstudio中创建一个普通的R文件(.R)保存在上述文件夹中,一般命名为
app.R
(也可自定义名称,但不推荐),作为主文件;其他文件根据需求放置;第三,
app.R
的内容也是模板化的,包括ui
、server
和调用shinyApp()
函数三部分,其中第三部分的内容是固定的,因此需要改动的只有前两部分。
当一个.R
文件具有上述三个部分时,RStudio的界面就会自动变化,出现Run App
按钮,用户点击后就会打开一个网页App(程序可运行的情况下)。
app.R
的一般样式如下:
library(shiny)# Define UI ----
ui <- fluidPage()# Define server logic ----
server <- function(input, output) {}# Run the app ----
shinyApp(ui = ui, server = server)
将上述代码复制到
app.R
中,点击运行按钮后可以得到一个空白网页,此时版本记为App V1。
1.2 快捷方法
在RStudio中,依次点击File
- New File
(前两步可以通过点击File
下方的加号代替) - Shiny Web App...
,就会弹出一个如下所示的对话框:
其中上面红框中填入的是文件夹名称,下面红框中是文件夹路径;点击Creat
后就创建了一个包含app.R
文件的文件夹。app.R
文件会自动在RStudio中打开,点击Run App
会运行出一个示例App,再点击网页右上角的关闭按钮App就会停止运行。
用户可以直接在app.R
文件的基础上进行修改以创建自己的App。
读者也可按照快捷方法创建一个Shiny App,再使用App V1的内容替换
app.R
的内容,作为App V1。
2 定义ui
这部分的功能是设计用户界面(User Interface,UI),所有的内容都添加在fluidPage()
函数内部。不过,若需要加载工具包或数据,一般应在定义ui
之前。
# Define UI ----
ui <- fluidPage()
2.1 布局函数
最常使用的布局函数是sidebarLayout()
,它使网页分成如下两个部分:左侧是操作面板,右侧是显示面板(位置也可互换)。
在该函数内部,再分别使用sidebarPanel()
和mainPanel()
函数定义两个面板,两个函数之间需用使用逗号,
隔开。
ui <- fluidPage(titlePanel("Shiny App的标题"),sidebarLayout(sidebarPanel(),mainPanel())
)
使用以上代码替换App V1中的
ui
部分,记为App V2。
更多布局函数[3]见:https://shiny.rstudio.com/articles/layout-guide.html
2.2 添加控件
在本部分之前,官网课程LESSON 2介绍了如何在面板中设置HTML文本、加载图片等内容,这里跳过这些内容;有需要的读者可以通过这个链接自学:https://shiny.rstudio.com/tutorial/written-tutorial/lesson2/。
控件(Control Widget)包括点击按钮、单选框、复选框、下拉框、输入框、日期选择器等,每个类型的控件都对应着相应的函数。控件是在操作面板中进行设置的,因此相关函数需要在sidebarPanel()
函数内部使用。
常见的控件形式如下图所示:
各函数对应的控件类型如下:
actionButton()
:点击按钮checkboxGroupInput()
:复选框checkboxInput()
:单选框dateInput()
:日期选择器dateRangeInput()
:日期范围选择器fileInput()
:文件加载按钮helpText()
:添加帮助文本numericInput()
:数字输入框radioButtons()
:圆形选择框selectInput()
:下拉框sliderInput()
:滑动条submitButton()
:提交按钮textInput()
:文本输入框
比如创建一个下拉框和复选框:
sidebarPanel(selectInput(inputId = "class",label = "班级",choices = c("1班" = 1, "2班" = 2, "3班" = 3),selected = "1班"),checkboxGroupInput(inputId = "subject", label = "学科",choices = c("语文" = "Chinese", "数学" = "Math", "英语" = "English","物理" = "Physics", "历史" = "Histroy"),selected = c("Chinese", "English"))
)
使用上述代码替换App V2中的
sidebarPanel()
部分,记为App V3。
运行App V3的结果如下图所示:
上述使用的两个控件函数都包括如下四个参数:
inputId
:相当于控件的变量名,方便后面对其内容进行调用;label
:显示在面板中的控件标签,如不需要可设置为""
;choices
:可供选择的项;等号前表示实际显示内容,等号后表示真实变量名称;selected
:控件在初始状态下的选择项。
参数因控件函数而异,但inputId
和label
是共有参数,详见https://shiny.rstudio.com/tutorial/written-tutorial/lesson3/。
2.3 定义输出形式
输出形式是在mainPanel()
函数内部定义的,不同的输出形式对应着相应的函数:
dataTableOutput()
:表格htmlOutput()
:网页imageOutput()
:图片plotOutput()
:绘图tableOutput()
:表格textOutput()
:文本uiOutput()
:网页verbatimTextOutput()
:文本
如下定义一个绘图输出项:
mainPanel(plotOutput(outputId = "plot")
)
使用上述代码替换App V3中的
mainPanel()
部分,记为App V4。
这里的作用是定义输出的形式和输出项名称,真正做出输出动作是在server
部分。
3 定义server
这部分实际上是定义一个如下形式的函数(session
参数可省略):
server <- function(input, output, session){}
这里的input
参数就是2.2节中sidebarPanel()
函数内部控件的选择项,如input$subject
、input$class
;output
参数就是2.3节mainPanel()
函数内部定义的输出项,如output$plot
。
由于下文需要做出输出动作,我们先定义一个示例数据:
library(ggplot2)
library(tidyr)
set.seed(0814)
data <- data.frame(ID = rep(1:300, 5),class = rep(1:3, 500),subject = rep(c("Chinese", "Math", "English", "Physics", "Histroy"), each = 300),grade = as.integer(runif(500, 30, 100))
)data <- spread(data, key = "subject", value = "grade")
将上述代码复制到App V4中
library(shiny)
和定义ui
之间,记为App V5。
与2.3节*Output
函数相对应的是render*
函数:
renderDataTable()
renderImage()
renderPlot()
renderPrint()
renderTable()
renderText()
renderUI()
如下代码:
server <- function(input, output) {output$plot <- renderPlot({data0 <- data[data$class == input$class, ]ggplot(data0, aes_string(x = input$subject[1], y = input$subject[2])) +geom_point() +geom_smooth(method = "lm") +theme_bw() })
}
使用上述代码替换App V5中的
server
部分,记为App V6。
需要注意的是:renderPlot()
函数是与前面的plotOutput()
对应的,该函数内只能写一句完整的语句,如果有多个语句,需要使用大括号{}
;output$plot
则与outputId = "plot"
相对应。
至此,一个简单的网页App就完成了,效果如下:
「参考资料」
[1]
shiny学习课程: https://shiny.rstudio.com/tutorial/written-tutorial/lesson1/
[2]
shiny练习项目: https://rstudio-education.github.io/shiny-course/
[3]
shiny布局函数: https://shiny.rstudio.com/articles/layout-guide.html
shiny | 使用R创建一个网页应用(Web App)相关推荐
- python建立一个简单的server_使用Python创建一个简易的Web Server
Python 2.x中自带了SimpleHTTPServer模块,到Python3.x中,该模块被合并到了http.server模块中.使用该模块,可以快速创建一个简易的Web服务器. 我们在C:\U ...
- IDEA中添加tomcat服务器和创建一个新的web项目
1.tomcat服务器的配置 第一步: 第二步:找到Templates 第三步: 第四步: 第五步: 第六步: 这样就完成了 2.创建一个新的web项目 第一步: 第二步: 第三步 第四步:
- 创建一个网页的基本步骤
创建一个网页的步骤 新建一个文本文档: 改后缀名为.html; 编辑网页:鼠标右键选择编辑器:
- java和asp.net core,VS 2019教程:创建ASP.NET Core Web App
启动Visual Studio 2019并创建一个新项目 启动Visual Studio 2019,然后单击Create new project.选择"ASP.NET Core Web Ap ...
- VS 2019教程:创建ASP.NET Core Web App
启动Visual Studio 2019并创建一个新项目 启动Visual Studio 2019,然后单击Create new project.选择"ASP.NET Core Web Ap ...
- vs2019怎么创建html,VS 2019教程:创建ASP.NET Core Web App
启动Visual Studio 2019并创建一个新项目 启动Visual Studio 2019,然后单击Create new project.选择"ASP.NET Core Web Ap ...
- web音频播放器_Web设计:如何创建一个时尚的Web音频播放器
我仍然记得在2000年代初,在线播放富媒体(音频和视频)时遇到了很多限制. 很容易就将开始视为理所当然,尤其是自从今天以来,我们有很多商店可以播放音频,例如last.fm或播放视频,例如Youtube ...
- 【SpringBoot零基础案例01】【IEDA 2021.1】如何创建一个SpringBoot框架web项目
一.创建一个空项目 点击[File]- [New]- [Project-],新建一个空项目 选择[Empty Project]点击[Next] 填写项目名称,选择项目本地存储路径,点击[Finish] ...
- 我的Go语言学习之旅八:创建一个简单的WEB服务器
因为一直在做WEB程序,所以更关注WEB界的发展,这里就用GO做了一个简单的WEB服务器,直接看例子吧 package main import ( "fmt" "net/ ...
- ASP.NET没有魔法——开篇-用VS创建一个ASP.NET Web程序
本文是本系列文章第一篇,主要通过建立一个默认ASP.NET MVC项目来引出与ASP.NET MVC相关的功能,由于ASP.NET MVC一个简单的模板就具备了数据库操作.身份验证.输入数据校验等功能 ...
最新文章
- java utf-8文件处理bom头
- Spring详解:WebServlet 中不能注入Bean对象
- 足坛绝代双骄全面数据对比,梅西30岁以后不如C罗?
- BootStrap学习(6)_模态框
- android的百度地图开发(二) 定位
- vasp 5.2编译方法
- 张娟娟(为奥运冠军名字作诗)
- mysql 游标总条数_mysql 游标的使用总结
- (王道408考研操作系统)第三章内存管理-第一节6-1:非连续分配管理方式之基本分页存储管理
- 01-Eureka是什么?
- mit数据集_MIT的DNN硬件加速器教程(二)流行的DNN和数据集
- zabbix通过OMSA监控Dell服务器
- Bin Packing 装箱问题——NPH问题的暴力枚举 状压DP
- 分析入门股票量化交易券商接口的方法
- ts 文件报错原因1
- 服务器管理口IP及账号密码(知识汇总)
- RPG或SLG游戏在线地图编辑器
- 记录一次 AGP 调研过程中的思考,我从一个事故搞出了一个故事!
- 如何显示和删除联想的OEM分区
- JAVA六大设计原则 和 23种设计模式
热门文章
- HHUOJ 1001 汽水瓶 (水题)
- 51单片机数码管静态显示
- 你只是看起来很努力-阅读记录
- 超人能一拳把某个人打出地球吗?
- UltraLAB台式图形工作站(海量计算王者~高性能计算工作站 EX620介绍)
- 【Python实例学习】用Python的xlsxwriter模块,进行Excel表格插入图标的操作
- 2021李林精讲精练880题 【数学二 解析分册】
- 腾讯QQ被盗的形式及密码保护技巧(转)
- org.apache.ibatis.binding.BindingException: Type interface com.chen.dao.PersonDao is not known to th
- c语言密文加密解密问题注释,c语言通过openssl aes对称加解密和base64编解码将密码存储成密文...