作者: 糖甜甜甜 ,R语言中文社区专栏作者
公众号:经管人学数据分析
前言
上篇文章中我们谈到R语言中shiny包用作企业业务数据轻量级web开发的好处,
R+ECharts2Shiny实现web动态交互式可视化数据(上),在这篇文章中我们推荐下在Shiny Gallery上的用shiny开发出来的优秀网站,部分网站有代码,大家可以在R中直接运行出来查看。
Shiny APP!
1.世界人口前景可视化web应用
GitHub地址: https://github.com/PPgp/wppExplorer
2.城市交通实时可视化web应用
GitHub地址: https://github.com/rstudio/shiny-examples/tree/master/086-bus-dashboard
3.美国非盈利大学可视化web应用
4.警力实时数据可视化web应用
GitHub地址: https://github.com/trestletech/dallas-police/
web应用中的部分功能的实现
以下的代码 可以直接复制粘贴在R中实现 ,通过从小功能的实现学习shiny包,平时爬取的数据可以选择自己用R或 python 搭一个轻量级的web,为数据提供更多的价值,并且这样的作品拿出来在面试数据分析职位会加不少分哟。
1.交互
在调用server函数,申明一个交互对象datasetInput,交互函数reactive用来对UI中的输入进行处理,依赖于input$dataset,然后被output调用,这里的数据可以是自己设定,excel、csv或者数据库都可以。
1library(shiny) 2 3# Define UI for dataset viewer app ---- 4ui <- fluidPage( 5 6 # App title ---- 7 titlePanel("Reactivity"), 8 9 # Sidebar layout with input and output definitions ---- 10 sidebarLayout( 11 12 # Sidebar panel for inputs ---- 13 sidebarPanel( 14 15 # Input: Text for providing a caption ---- 16 textInput(inputId = "caption", 17 label = "Caption:", 18 value = "Data Summary"), 19 20 # Input: Selector for choosing dataset ---- 21 selectInput(inputId = "dataset", 22 label = "Choose a dataset:", 23 choices = c("rock", "pressure", "cars")), 24 25 # Input: Numeric entry for number of obs to view ---- 26 numericInput(inputId = "obs", 27 label = "Number of observations to view:", 28 value = 10) 29 30 ), 31 32 # Main panel for displaying outputs ---- 33 mainPanel( 34 35 # Output: Formatted text for caption ---- 36 h3(textOutput("caption", container = span)), 37 38 # Output: Verbatim text for data summary ---- 39 verbatimTextOutput("summary"), 40 41 # Output: HTML table with requested number of observations ---- 42 tableOutput("view") 43 44 ) 45 ) 46) 47 48# Define server logic to summarize and view selected dataset ---- 49server <- function(input, output) { 50 51 # Return the requested dataset ---- 52 datasetInput <- reactive({ 53 switch(input$dataset, 54 "rock" = rock, 55 "pressure" = pressure, 56 "cars" = cars) 57 }) 58 59 # Create caption ---- 60 output$caption <- renderText({ 61 input$caption 62 }) 63 64 # Generate a summary of the dataset ---- 65 output$summary <- renderPrint({ 66 dataset <- datasetInput() 67 summary(dataset) 68 }) 69 70 # Show the first "n" observations ---- 71 output$view <- renderTable({ 72 head(datasetInput(), n = input$obs) 73 }) 74} 75 76shinyApp(ui, server)
2.控件
shiny中关于控件的函数比较多,不同的数据输入可以由多个控件来控制,更方便的由各个业务角度来展示数据。
1library(shiny) 2 3# Define UI for slider demo app ---- 4ui <- fluidPage( 5 6 # App title ---- 7 titlePanel("Sliders"), 8 9 # Sidebar layout with input and output definitions ---- 10 sidebarLayout( 11 12 # Sidebar to demonstrate various slider options ---- 13 sidebarPanel( 14 15 # Input: Simple integer interval ---- 16 sliderInput("integer", "Integer:", 17 min = 0, max = 1000, 18 value = 500), 19 20 # Input: Decimal interval with step value ---- 21 sliderInput("decimal", "Decimal:", 22 min = 0, max = 1, 23 value = 0.5, step = 0.1), 24 25 # Input: Specification of range within an interval ---- 26 sliderInput("range", "Range:", 27 min = 1, max = 1000, 28 value = c(200,500)), 29 30 # Input: Custom currency format for with basic animation ---- 31 sliderInput("format", "Custom Format:", 32 min = 0, max = 10000, 33 value = 0, step = 2500, 34 pre = "$", sep = ",", 35 animate = TRUE), 36 37 # Input: Animation with custom interval (in ms) ---- 38 # to control speed, plus looping 39 sliderInput("animation", "Looping Animation:", 40 min = 1, max = 2000, 41 value = 1, step = 10, 42 animate = 43 animationOptions(interval = 300, loop = TRUE)) 44 45 ), 46 47 # Main panel for displaying outputs ---- 48 mainPanel( 49 50 # Output: Table summarizing the values entered ---- 51 tableOutput("values") 52 53 ) 54 ) 55) 56 57# Define server logic for slider examples ---- 58server <- function(input, output) { 59 60 # Reactive expression to create data frame of all input values ---- 61 sliderValues <- reactive({ 62 63 data.frame( 64 Name = c("Integer", 65 "Decimal", 66 "Range", 67 "Custom Format", 68 "Animation"), 69 Value = as.character(c(input$integer, 70 input$decimal, 71 paste(input$range, collapse = " "), 72 input$format, 73 input$animation)), 74 stringsAsFactors = FALSE) 75 76 }) 77 78 # Show the values in an HTML table ---- 79 output$values <- renderTable({ 80 sliderValues() 81 }) 82 83} 84 85# Create Shiny app ---- 86shinyApp(ui, server)
3.UI引用HTML文件
UI可以完全引用HTML文件,为用户界面加上丰富的样式和交互,但是写HTML文件需要了解html、css和js等内容。
UI部分的.html
1<html> 2 3<head> 4 <script src="shared/jquery.js" type="text/javascript"></script> 5 <script src="shared/shiny.js" type="text/javascript"></script> 6 <link rel="stylesheet" type="text/css" href="shared/shiny.css"/> 7</head> 8 9<body> 10 11 <h1>HTML UI</h1> 12 13 <p> 14 <label>Distribution type:</label><br /> 15 <select name="dist"> 16 <option value="norm">Normal</option> 17 <option value="unif">Uniform</option> 18 <option value="lnorm">Log-normal</option> 19 <option value="exp">Exponential</option> 20 </select> 21 </p> 22 23 <p> 24 25 <label>Number of observations:</label><br /> 26 <input type="number" name="n" value="500" min="1" max="1000" /> 27 28 </p> 29 30 <h3>Summary of data:</h3> 31 <pre id="summary" class="shiny-text-output"></pre> 32 33 <h3>Plot of data:</h3> 34 <div id="plot" class="shiny-plot-output" 35 style="width: 100%; height: 300px"></div> 36 37 <h3>Head of data:</h3> 38 <div id="table" class="shiny-html-output"></div> 39 40</body> 41</html>
server.R
1library(shiny) 2 3# Define server logic for random distribution app ---- 4server <- function(input, output) { 5 6 # Reactive expression to generate the requested distribution ---- 7 # This is called whenever the inputs change. The output functions 8 # defined below then use the value computed from this expression 9 d <- reactive({ 10 dist <- switch(input$dist, 11 norm = rnorm, 12 unif = runif, 13 lnorm = rlnorm, 14 exp = rexp, 15 rnorm) 16 17 dist(input$n) 18 }) 19 20 # Generate a plot of the data ---- 21 # Also uses the inputs to build the plot label. Note that the 22 # dependencies on the inputs and the data reactive expression are 23 # both tracked, and all expressions are called in the sequence 24 # implied by the dependency graph. 25 output$plot <- renderPlot({ 26 dist <- input$dist 27 n <- input$n 28 29 hist(d(), 30 main = paste("r", dist, "(", n, ")", sep = ""), 31 col = "#75AADB", border = "white") 32 }) 33 34 # Generate a summary of the data ---- 35 output$summary <- renderPrint({ 36 summary(d()) 37 }) 38 39 # Generate an HTML table view of the head of the data ---- 40 output$table <- renderTable({ 41 head(data.frame(x = d())) 42 }) 43 44} 45 46# Create Shiny app ---- 47shinyApp(ui = htmlTemplate("www/index.html"), server)
4.文件上传
在UI部分加入fileInput函数,在server函数中用input$file来实现文件上载功能。
1library(shiny) 2 3# Define UI for data upload app ---- 4ui <- fluidPage( 5 6 # App title ---- 7 titlePanel("Uploading Files"), 8 9 # Sidebar layout with input and output definitions ---- 10 sidebarLayout( 11 12 # Sidebar panel for inputs ---- 13 sidebarPanel( 14 15 # Input: Select a file ---- 16 fileInput("file1", "Choose CSV File", 17 multiple = FALSE, 18 accept = c("text/csv", 19 "text/comma-separated-values,text/plain", 20 ".csv")), 21 22 # Horizontal line ---- 23 tags$hr(), 24 25 # Input: Checkbox if file has header ---- 26 checkboxInput("header", "Header", TRUE), 27 28 # Input: Select separator ---- 29 radioButtons("sep", "Separator", 30 choices = c(Comma = ",", 31 Semicolon = ";", 32 Tab = "\t"), 33 selected = ","), 34 35 # Input: Select quotes ---- 36 radioButtons("quote", "Quote", 37 choices = c(None = "", 38 "Double Quote" = '"', 39 "Single Quote" = "'"), 40 selected = '"'), 41 42 # Horizontal line ---- 43 tags$hr(), 44 45 # Input: Select number of rows to display ---- 46 radioButtons("disp", "Display", 47 choices = c(Head = "head", 48 All = "all"), 49 selected = "head") 50 51 ), 52 53 # Main panel for displaying outputs ---- 54 mainPanel( 55 56 # Output: Data file ---- 57 tableOutput("contents") 58 59 ) 60 61 ) 62) 63 64# Define server logic to read selected file ---- 65server <- function(input, output) { 66 67 output$contents <- renderTable({ 68 69 # input$file1 will be NULL initially. After the user selects 70 # and uploads a file, head of that data file by default, 71 # or all rows if selected, will be shown. 72 73 req(input$file1) 74 75 # when reading semicolon separated files, 76 # having a comma separator causes `read.csv` to error 77 tryCatch( 78 { 79 df <- read.csv(input$file1$datapath, 80 header = input$header, 81 sep = input$sep, 82 quote = input$quote) 83 }, 84 error = function(e) { 85 # return a safeError if a parsing error occurs 86 stop(safeError(e)) 87 } 88 ) 89 90 if(input$disp == "head") { 91 return(head(df)) 92 } 93 else { 94 return(df) 95 } 96 97 }) 98 99} 100 101# Create Shiny app ---- 102shinyApp(ui, server)
5.文件下载
在UI部分使用downloadButton函数,在server函数中用downloadHandler来实现文件下载功能。
1library(shiny) 2 3# Define UI for data download app ---- 4ui <- fluidPage( 5 6 # App title ---- 7 titlePanel("Downloading Data"), 8 9 # Sidebar layout with input and output definitions ---- 10 sidebarLayout( 11 12 # Sidebar panel for inputs ---- 13 sidebarPanel( 14 15 # Input: Choose dataset ---- 16 selectInput("dataset", "Choose a dataset:", 17 choices = c("rock", "pressure", "cars")), 18 19 # Button 20 downloadButton("downloadData", "Download") 21 22 ), 23 24 # Main panel for displaying outputs ---- 25 mainPanel( 26 27 tableOutput("table") 28 29 ) 30 31 ) 32) 33 34# Define server logic to display and download selected file ---- 35server <- function(input, output) { 36 37 # Reactive value for selected dataset ---- 38 datasetInput <- reactive({ 39 switch(input$dataset, 40 "rock" = rock, 41 "pressure" = pressure, 42 "cars" = cars) 43 }) 44 45 # Table of selected dataset ---- 46 output$table <- renderTable({ 47 datasetInput() 48 }) 49 50 # Downloadable csv of selected dataset ---- 51 output$downloadData <- downloadHandler( 52 filename = function() { 53 paste(input$dataset, ".csv", sep = "") 54 }, 55 content = function(file) { 56 write.csv(datasetInput(), file, row.names = FALSE) 57 } 58 ) 59 60} 61 62# Create Shiny app ---- 63shinyApp(ui, server)
参考
1、 https://github.com/rstudio/shiny-examples
往期精彩:
公众号后台回复关键字即可学习
回复 爬虫 爬虫三大案例实战
回复 Python 1小时破冰入门
回复 数据挖掘 R语言入门及数据挖掘
回复 人工智能 三个月入门人工智能
回复 数据分析师 数据分析师成长之路
回复 机器学习 机器学习的商业应用
回复 数据科学 数据科学实战
回复 常用算法常用数据挖掘算法
本文由R语言中文社区 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Bokeh 1.0.3 发布,Python 交互式可视化库
- 基于Python实现交互式数据可视化的工具(用于Web)
- Bokeh 0.12.7 dev17 发布,Python 交互式可视化库
- Bokeh 0.12.7 正式版发布,Python 交互式可视化库
- ECharts 5.0.1 发布,JavaScript 实现的交互式图表可视化库
- ECharts 5.1.0 发布,JS 实现的交互式图表可视化库
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
The Book of CSS3
Peter Gasston / No Starch Press / 2011-5-13 / USD 34.95
CSS3 is the technology behind most of the eye-catching visuals on the Web today, but the official documentation can be dry and hard to follow. Luckily, The Book of CSS3 distills the heady technical la......一起来看看 《The Book of CSS3》 这本书的介绍吧!