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. Oracle入门笔记 ——启动

    参考教材<深入浅出Oracle> 兴趣 + 勤奋 + 坚持 + 方法 ≍ 成功 DBA生存之四大守则 1.备份重于一切: 2.三思而后行: 3.rm是危险的: 4.你来制定规范: 第一章: ...

  2. github(其他类似github)下载到本地配置

    首先是先装完插件,低版本的myeclipse要自己装插件, 如何使window->show view->other找到git 注意是选第二个... 然后next->next-> ...

  3. Redis对于key的操作命令

     del key1 key2 ... Keyn 作用: 删除1个或多个键 返回值: 不存在的key忽略掉,返回真正删除的key的数量 rename key newkey 作用: 给key赋一个新的ke ...

  4. 结合Ajax做地区内容切换!(城市切换)

    实现原理:点击,进行异步保存Cookie , 根据保存的Cookie来切换城市内容: 简单HTML示例: <!doctype html> <html> <head> ...

  5. Linux 使用 常识记忆

    1.当系统突然死机需要重启时,打开 命令输入端口,使用快捷键 Shift +Alt +F(1或6)打开 ,然后输入 shutdown -r now 如果提示shutdown need to be ro ...

  6. Python 之定时器

    #引入库 threading import threading #定义函数 def fun_timer(): print('hello timer')   #打印输出 global timer  #定 ...

  7. Publish over SSH插件安装

    1 Publish over SSH插件安装 打开Jenkins的“系统管理>管理插件”,选择“可选插件”,在输入框中输入“Publish over SSH”进行搜索,如果搜索不到可以在“已安装 ...

  8. 170504、MongoDB和MySQL对比(译)

    一.概要 几十年来,关系型数据库已经成为企业应用程序的基础,自从MySQL在1995年发布以来,它已经成为一种受欢迎并且廉价的选择.然而随着近年来数据量和数据的不断激增,非关系数据库技术如MongoD ...

  9. Oracle Schema Objects——Index

    索引主要的作用是查询优化. Oracle Schema Objects 查看执行计划的权限:查看执行计划plustrace:set autotrace trace exp stat(SP2-0618. ...

  10. 容斥原理解决某个区间[1,n]闭区间与m互质数数量问题

    首先贴出代码(闭区间[1,n]范围内和m互质的数) 代码: int solve(II n,II m){ vector<II>p; ;i*i<=m;i++){ ){ p.push_ba ...