R 本身是一个优秀的数据分析和数据可视化平台。然而,我们通常不会将 R 和分析脚
本提供给客户,让客户自己运行。数据分析的结果不仅可以在 HTML 网页、PDF 文档
或 Word 文档中显示,还可以呈现在交互式应用中,这种应用允许用户与数据进行交互,
用户可以修改某些参数并查看结果如何发生变化。
由 RStudio 开发的一个功能强大的扩展包 shiny(http://shiny.rstudio.com/) 就是专们为
此设计的。shiny 应用程序不同于我们之前所演示的交互式图形。它在 Web 浏览器中运行,
开发人员对网页中出现的内容,以及用户如何与它进行交互有完全的话语权。为了实现程
序功能,一个 shiny 应用程序基本上由两个重要部分组成:一个是与 Web 浏览器交互
的 HTTP 服务器,另一个是与 HTTP 服务器交互的 R 会话。
下面是一个最小的 shiny 应用程序。我们编写一个 R 脚本定义它的用户界面(ui)和
服务器(server)逻辑。用户界面是一个 boostrapPage,包含一个 numericInput 用
于接收一个整数表示样本容量,一个 textOutput 用于返回随机样本的均值。服务器
(server)背后的逻辑就是根据输入 input 的样本容量(n)生成随机数,计算随机样本的
均值,并放到输出结果 output 中:
library(shiny)
ui <- bootstrapPage(
numericInput("n", label = "Sample size", value = 10, min = 10, max =
100),
textOutput("mean")
)
server <- function(input, output) {
output$mean <- renderText(mean(rnorm(input$n)))
}
app <- shinyApp(ui, server)
runApp(app)
现在我们已经完成了定义,可以在 RStudio 中运行这段代码,展示这个最小的 shiny 应
用程序,运行结果如图 15-16 所示。

图 15-16
每次更改样本容量时,HTTP 服务器就会指令 R 后端重新运行一次,并更新输出的平
均值。
尽管前面的例子没有什么实质用途,但它演示了一个 shiny 应用程序的基本组件。现
在我们来看一个更复杂更有用的例子。
这个例子将几何布朗运动生成的许多路径进行可视化,几何布朗运动常用于股票价格建
模。我们知道,几何布朗运动的结果取决于初始值、预期增长率(r)、波动率(sigma)、持
续时间(T)和周期数(periods)。除了设定 T = 1 之外,我们允许用户修改其他所有参数。
现在,我们可以根据想要展示给用户的参数来定义 shiny 应用程序的用户界面。shiny 扩
展包提供了以下列示的丰富的输入控件:
shiny_vars <- ls(getNamespace("shiny"))
shiny_vars[grep("Input$", shiny_vars)]
## [1] "checkboxGroupInput" "checkboxInput"
## [3] "dateInput" "dateRangeInput"
## [5] "fileInput" "numericInput"
## [7] "passwordInput" "selectInput"
## [9] "selectizeInput" "sliderInput"
## [11] "textInput" "updateCheckboxGroupInput"
## [13] "updateCheckboxInput" "updateDateInput"
## [15] "updateDateRangeInput" "updateNumericInput"
## [17] "updateSelectInput" "updateSelectizeInput"
## [19] "updateSliderInput" "updateTextInput"
为了控制生成路径的随机性,我们允许用户指定随机数种子(seed),这样相同的种子
会生成相同的路径。定义用户界面的代码时,将 seed 作为 numericInput 的输入参数,
将其他输入参数作为 sliderInput 的参数。而且,sliderInput 控件有一定的范围和
步长,因此我们可以限定参数取值的合理范围。
用户界面不仅定义输入部分还定义输出部分,即在哪里显示什么内容。以下是 shiny 提
供的所有输出类型:
shiny_vars[grep("Output$", shiny_vars)]
## [1] "dataTableOutput" "htmlOutput"
## [3] "imageOutput" "plotOutput"
## [5] "tableOutput" "textOutput"
## [7] "uiOutput" "verbatimTextOutput"
在这个例子中,shiny 应用程序只是将所有路径放在一起,用于展示相同参数产生的各
种可能结果:
library(shiny)
ui <- fluidPage(
titlePanel("Random walk"),
sidebarLayout(
sidebarPanel(
numericInput("seed", "Random seed", 123),
sliderInput("paths", "Paths", 1, 100, 1),
sliderInput("start", "Starting value", 1, 10, 1, 1),
sliderInput("r", "Expected return", -0.1, 0.1, 0, 0.001),
sliderInput("sigma", "Sigma", 0.001, 1, 0.01, 0.001),
sliderInput("periods", "Periods", 10, 1000, 200, 10)),
mainPanel(
plotOutput("plot", width = "100%", height = "600px")
))
)
定义了用户界面以后,我们需要实现服务器的逻辑,它主要根据用户指定的参数生成
随机路径,并将它们放在同一幅图中。
以下代码是服务器逻辑的一个简单的实现。首先,设置随机数种子。然后,迭代调
用 sde::GBM,通过几何布朗运动生成随机路径。在调用 GBM 之前,要先运行 install.
packages("sde") 安装扩展包。
GBM 生成一条路径,sapply( )则将生成的所有路径组合成一个矩阵(mat),矩
阵的每一列都代表一条路径。最后,我们调用 matplot( ),在一幅图中用不同颜色区
分不同路径。
无论文本、图形还是表格,相关计算过程都是在 render* 函数中完成的。以下列出
shiny 扩展包提供的所有 render 函数:
shiny_vars[grep("^render", shiny_vars)]
## [1] "renderDataTable" "renderImage" "renderPage"
## [4] "renderPlot" "renderPrint" "renderReactLog"
## [7] "renderTable" "renderText" "renderUI"
在这个例子中,我们只需调用 renderPlot( ),将绘图代码放到函数中。当输入参
数被修改时,output$plot 函数将会转向用户界面中的 plotOutput("plot"):
server <- function(input, output) {
output$plot <- renderPlot({
set.seed(input$seed)
mat <- sapply(seq_ _len(input$paths), function(i) {
sde::GBM(input$start,
input$r, input$sigma, 1, input$periods)
})
matplot(mat, type = "l", lty = 1,
main = "Geometric Brownian motions")
})
}
现在,用户界面和服务器的逻辑都准备好了。我们把它们结合到一起,创建一个 shiny 应用
程序,并在 Web 浏览器中运行。
app <- shinyApp(ui, server)
runApp(app)
当参数被修改之后,绘图会自动更新,如图 15-17 所示。

图 15-17
如果设置了一个显著为正的预期年化收益,所生成的路径将趋于增长而非下降,
如图 15-18 所示。

图 15-18

创建 shiny 应用程序的更多相关文章

  1. ASP.NET MVC - 创建Internet 应用程序

    为了学习 ASP.NET MVC,我们将构建一个 Internet 应用程序. 第 1 部分:创建应用程序. 我们将构建什么 我们将构建一个支持添加.编辑.删除和列出数据库存储信息的 Internet ...

  2. Momentics创建Photon图形程序

    Photon microGui是qnx原生的UI图形工具.Qnx下开发Photon 一般是使用phAB来创建,使用默认的Momentics IDE也可以创建Photon图形程序. 首先需要创建一个c/ ...

  3. SharePoint 2013 创建web应用程序报错"This page can’t be displayed"

    错误描述 This page can’t be displayed •Make sure the web address http://centeradmin is correct. •Look fo ...

  4. [SharePoint 2013 入门教程 2 ] 创建WEB应用程序,网站集,网站

    SharePoint 2013 的 Hello World 由大到小  创建WEB应用程序(老母),网站集(儿子),网站(孙子) 直接确定,其余都默认 填入标题,选好模板.网站集 儿子就有了. 点击页 ...

  5. nodejs+chromium 创建桌面应用程序

    直接用nodejs+javascript+html+css也可以创建桌面应用程序啦,前端开发的同学应该都比较感兴趣. 生成的应用程序自带nodejs环境和chrome浏览器环境. github的ato ...

  6. SharePoint 2013 创建web应用程序报错&quot;This page can’t be displayed&quot;

    错误描写叙述 This page can't be displayed •Make sure the web address http://centeradmin is correct. •Look ...

  7. NET5实践:项目创建-结构概述-程序运行-发布部署

    ASP.NET5实践01:项目创建-结构概述-程序运行-发布部署   1.项目创建 ASP.NET5项目模板有三种: 新建项目: 选择模板: 2.结构概述 References对应配置是project ...

  8. SpringMVC基础入门,创建一个HelloWorld程序

    ref:http://www.admin10000.com/document/6436.html 一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要 ...

  9. .net core创建控制台应用程序和mvc程序

    一.创建控制台应用程序 1.查看支持哪些类型:dotnet new --help 2.创建项目(先定位到需要创建的目录) dotnet new console -o ./myconsole 3.查看目 ...

随机推荐

  1. android去除Spinner的分割线

    <style name="TestSpinnerStyle" parent="android:style/Widget.ListView.DropDown" ...

  2. 微信小程序 --- 缓存数据

    保存数据  /  读取数据  /  删除数据  /  数据异步操作 每一个微信小程序都可以有自己的本地缓存,可以通过wx.setStorage( wx.setStorageSync) ,wx.getS ...

  3. Hadoop集群搭建文档

      环境: Win7系统装虚拟机虚拟机VMware-workstation-full-9.0.0-812388.exe Linux系统Ubuntu12.0.4 JDK                j ...

  4. 爬虫实战【3】Python-如何将html转化为pdf(PdfKit)

    前言 前面我们对博客园的文章进行了爬取,结果比较令人满意,可以一下子下载某个博主的所有文章了.但是,我们获取的只有文章中的文本内容,并且是没有排版的,看起来也比较费劲... 咋么办的?一个比较好的方法 ...

  5. 求全局最小割(SW算法)

    hdu3002 King of Destruction Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (J ...

  6. Floyd算法并输出路径

    hdu1224 Free DIY Tour Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Ot ...

  7. pandas处理日期时间,按照时间筛选

    pandas有着强大的日期数据处理功能,本期我们来了解下pandas处理日期数据的一些基本功能,主要包括以下三个方面: 按日期筛选数据 按日期显示数据 按日期统计数据 运行环境为 windows系统, ...

  8. php程序中判断session过期

    我们最常用的是在php程序中设置,如下例程序所示: if(!isset($_SESSION['abc']) || time()-$_SESSION['abc']>60){ $_SESSION[' ...

  9. 170523、快速提升你 MySQL 数据库的段位

    MySQL 数据库知识脉络,大致可以分为四大模块: ● MySQL 体系结构: ● MySQL 备份恢复: ● MySQL 高可用集群: ● MySQL 优化. 从四大模块中,抽离7个部分给大家做分析 ...

  10. 百度输入法引起的Mac远程桌面Ctrl+.快捷键不起作用

    被这个问题困扰已久!在Mac中通过远程桌面(Remote Desktop)连接至Windows服务器时,Ctrl+.快捷键不起作用,而这是用Visual Studio写代码时常用的快捷键(对应的命令是 ...