11

利用 shiny 包快速搭建可视化原型系统

 3 years ago
source link: https://cosx.org/2016/06/use-shiny-fleetly-set-up-visual-prototype-system/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

利用 shiny 包快速搭建可视化原型系统

关键词:shiny 包; 可视化原型系统

前几周给大家分享了一篇《利用 R 语言进行交互数据可视化》的文章。文章末尾提到的在 R 的环境中,动态交互图形的优势在于能和 knitr、shiny 等框架整合在一起,能迅速建立一套可视化原型系统。今天接着给大家分享如何将动态交互图形与 shiny 框架整合在一起,迅速建立一套可视化原型系统。

Shiny 是 R 中的一种 Web 开发框架,使得 R 的使用者不必太了解 css、js 只需要了解一些 html 的知识就可以快速完成 web 开发,且 shiny 包集成了 bootstrap、jquery、ajax 等特性,极大解放了作为统计语言的 R 的生产力。

Shiny 应用包含连个基本的组成部分:一个是用户界面脚本(a user-interface script),另一个是服务器脚本 (a server script)。

Shiny应用包含连个基本的组成部分

  • 用户界面 (ui) 脚本控制应用的布局与外表,它定义在一个称作 R 的源脚本中。
  • 服务器 (server) 脚本包含构建应用所需要的一些重要指示,它定义在一个称作 R 的源脚本中。

你可以在一个目录中保存一个 ui.R 文件和 server.R 文件来创建一个 Shiny 应用。每一个应用都需要自己独特的存放位置。运行应用的方法是在函数 runApp 中置入目录名称。例如你的应用目录名称为 myapp, 且放在 D 盘目录下,那么键入以下代码可以执行应用:

library(shiny)
runApp("D:/myapp")

运行完成后自动生成一个网页展示结果。

也可以将 ui 和 server 代码写在一个脚本内,通过 shinyApp 执行该 app。运行以下脚本将得到一个简单的 web 版直方图。

# app.R#
if(require(shiny)) install.packages("shiny")
ui <- fluidPage(
numericInput(inputId = "n",
"Sample size", value = 25),
plotOutput(outputId = "hist")
)

server <- function(input, output) {
output$hist <- renderPlot({
hist(rnorm(input$n))
})
}
shinyApp(ui = ui, server = server)

~M4UT2WID$7MR462EO9M~F6

shinydashboard 扩展包为 shiny 框架提供了 BI 框架,一个 dashboard 由三部分组成:标题栏、侧边栏、主面板。通过 install.packages(“shinydashboard”) 完成安装。执行以下脚本可以得到 shinydashboard 的基本框架。

# app.R #
library(shiny)
if(require(shinydashboard)) install.packages("shinydashboard")
ui <- dashboardPage(
dashboardHeader(),
dashboardSidebar(),
dashboardBody()
)

server <- function(input, output) { }
shinyApp(ui, server)

LA_74B35XI8Q2GO71L_T)V

到此,关于 shiny 和 shinydashboard 框架我们已经掌握了。接下来,我们将前面学到的动态交互绘图包与 Shiny Web 开发框架结合,一步步搭建数据可视化平台 demo。先创建新文件夹 myapp,并在 myapp 文件夹里面创建两个脚本 ui.R 和 server.R,用来存放客户端和服务端的脚本。

# server.R #
output$mygraph <- renderPlot({
graph_function(formula,data=,…)
})

# ui.R #
plotOutput("mygraph")

例如,我们想在网页上输出了 lattice 函数绘制的散点图矩阵和三维曲面图,server.R 及 ui.R 的核心代码如下:

# server.R #
# 利用lattice包中的绘图函数
output$splom <- renderPlot({
splom(mtcars[c(1, 3:7)], groups = mtcars$cyl,
pscales = 0,pch=1:3,col=1:3,
varnames = c("Miles\nper\ngallon", "Displacement\n(cu. in.)",
"Gross\nhorsepower", "Rear\naxle\nratio",
"Weight", "1/4 mile\ntime"),
key = list(columns = 3, title = "Number of Cylinders",
text=list(levels(factor(mtcars$cyl))),
points=list(pch=1:3,col=1:3)))
})

output$wireframe <- renderPlot({
wireframe(volcano, shade = TRUE,
aspect = c(61/87, 0.4),
light.source = c(10,0,10))
})
# ui.R #
plotOutput("splom"),
plotOutput("wireframe")

平台界面如下图所示:

6VR87SQB8W65HT08

对于 rCharts 包绘制的图形,我们在 server.R 中用 renderChart() 函数将图形赋予输出对象 mygraph,并在 ui.R 中用 showOutput(“mygraph” ) 将图形输出到 web 中。形式如下(以 hPlot 函数为例):

# server.R #
output$mygraph <- renderChart({
p1 <- hPlot(formula,data,type, ...)
p1$addParams(dom="mygraph")
return(p1)
})
# ui.R #
showOutput("mygraph","highcharts")

如下图所示,我们在网页上输出了 nPlot 函数绘制的交互柱状图。

# server.R #
output$mychart1 <- renderChart({
hair_eye_male <- subset(as.data.frame(HairEyeColor), Sex == "Male")
hair_eye_male[,1] <- paste0("Hair",hair_eye_male[,1])
hair_eye_male[,2] <- paste0("Eye",hair_eye_male[,2])
p1 <- nPlot(Freq ~ Hair, group = "Eye", data = hair_eye_male, type = "multiBarChart")
p1$chart(color = c('brown', 'blue', '#594c26', 'green'))
p1$addParams(dom="mychart1")
return(p1)
})
# ui.R #
showOutput("mychart1","nvd3")

ZG9Q9WYN071IKW8UVRXC

如下图所示,我们在网页上输出了 hPlot 函数绘制的交互气泡图。

# server.R #
output$mychart2 <- renderChart({
a <- hPlot(Pulse ~ Height, data = MASS::survey, type = "bubble", title = "Zoom demo", subtitle = "bubble chart", size = "Age", group = "Exer")
a$colors('rgba(223, 83, 83, .5)', 'rgba(119, 152, 191, .5)', 'rgba(60, 179, 113, .5)')
a$chart(zoomType = "xy")
a$exporting(enabled = T)
a$addParams(dom="mychart2")
return(a)
})
# ui.R #
showOutput("mychart2","highcharts")

NNW9QYQ8XA6CV%SLCKQ5A

对于 DT 包制作的数据表格,我们在 server.R 中用 renderDataTable () 函数将表格赋予输出对象 mytable,并在 ui.R 中用 dataTableOutput (“mytable” ) 将图形输出到 web 中。形式如下:

# server.R #
output$mytable <- renderDataTable({
datatable(data)
})
# ui.R #
dataTableOutput("mytable")

BC3E.tmp

对于 networkD3 包制作的网络图,我们在 server.R 中用 renderForceNetwork () 函数将表格赋予输出对象 mygraph,并在 ui.R 中用 forceNetworkOutput (“mygraph” ) 将图形输出到 web 中。形式如下:

# server.R #
output$mygraph <- renderForceNetwork ({
forceNetwork (…)
})<
# ui.R #
forceNetworkOutput ("mygraph")

如下图所示,我们在网页上展示力导向网络图。

# server.R #
output$networkD3 <- renderForceNetwork({
forceNetwork(Links = MisLinks, Nodes = MisNodes,
Source = "source", Target = "target",
Value = "value", NodeID = "name",
Group = "group", opacity = 0.8,zoom = T)
})
# ui.R #
forceNetworkOutput("networkD3")

4EDD.tmp

好了,以上就是关于如何将一些数据可视化包结合 shiny,快速搭建一套可视化原型系统。由于篇幅有限,本文不能将页面设计及控件代码都一一罗列出。对 shiny 包感兴趣的读者可以自己上 RStudio 官网自行学习。

http://shiny.rstudio.com/

http://rstudio.github.io/shinydashboard/

最后,shiny 除了能完美结合数据可视化包绘制出的精美动态图表,对于模型结果可视化,我们也可以使用这种方式把可视化结果在网页上输出。我们对关联规则和 kmeans 聚类结果进行了可视化,并增加了选择栏和数字输入选项来调整关联规则可视化的方法和聚类的 K 值。

85E.tmp

可以通过控件去控制关联规则可视化中的 method 类型及 K-Means 聚类中的 K 值。

FD59.tmp

乐逗游戏高级数据分析师,负责大数据挖掘及可视化。资深 R 语言用户,有九年以上数据挖掘工作实战经验,多次在中国 R 语言大会上作主题演讲。与张良均老师、杨坦老师合著的《R 语言与数据挖掘》一书已在 2016 年 7 月出版,新书《R 语言游戏数据分析》一书也即将于 2017 年初出版。谢佳标

敬告各位友媒,如需转载,请与统计之都小编联系(直接留言或发至邮箱:[email protected]),获准转载的请在显著位置注明作者和出处(转载自:统计之都),并在文章结尾处附上统计之都微信二维码。

统计之都微信二维码

← 张志华教授:机器学习——统计与计算之恋 2016 年 “大数据时代的统计学” 教学研讨会通知 →

发表 / 查看评论


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK