R+ECharts2Shiny实现web动态交互式可视化数据(中)

栏目: R语言 · 发布时间: 6年前

R+ECharts2Shiny实现web动态交互式可视化数据(中)

作者: 糖甜甜甜 ,R语言中文社区专栏作者

公众号:经管人学数据分析

前言

上篇文章中我们谈到R语言中shiny包用作企业业务数据轻量级web开发的好处,

R+ECharts2Shiny实现web动态交互式可视化数据(上),在这篇文章中我们推荐下在Shiny Gallery上的用shiny开发出来的优秀网站,部分网站有代码,大家可以在R中直接运行出来查看。

Shiny APP!

1.世界人口前景可视化web应用

R+ECharts2Shiny实现web动态交互式可视化数据(中)

GitHub地址: https://github.com/PPgp/wppExplorer

2.城市交通实时可视化web应用

R+ECharts2Shiny实现web动态交互式可视化数据(中)

GitHub地址: https://github.com/rstudio/shiny-examples/tree/master/086-bus-dashboard

3.美国非盈利大学可视化web应用

4.警力实时数据可视化web应用

R+ECharts2Shiny实现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

R+ECharts2Shiny实现web动态交互式可视化数据(中)

往期精彩:

R+ECharts2Shiny实现web动态交互式可视化数据(中)

公众号后台回复关键字即可学习

回复  爬虫             爬虫三大案例实战

回复  Python        1小时破冰入门

回复  数据挖掘      R语言入门及数据挖掘

回复  人工智能      三个月入门人工智能

回复  数据分析师   数据分析师成长之路 

回复  机器学习      机器学习的商业应用

回复  数据科学      数据科学实战

回复  常用算法     

常用数据挖掘算法

本文由R语言中文社区 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。

转载、引用前需联系作者,并署名作者且注明文章出处。

本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Boolean Reasoning

Boolean Reasoning

Brown, Frank Markham / 2003-4 / $ 19.15

A systematic treatment of Boolean reasoning, this concise, newly revised edition combines the works of early logicians with recent investigations, including previously unpublished research results. Th......一起来看看 《Boolean Reasoning》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

URL 编码/解码
URL 编码/解码

URL 编码/解码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具