【问题标题】:Subsetting data from checkbox in Shiny to create bar graph and pie chart从 Shiny 中的复选框中子集数据以创建条形图和饼图
【发布时间】:2018-02-19 17:59:32
【问题描述】:

我对 Shiny(和一般的 R)相当陌生,并且一直在努力创建一个应用程序,该应用程序可以按储备、类别、使用类型和年份对数据进行子集化,以便创建随时间变化的使用条形图和饼图,平均使用三个类别之间的每一个。这是我的数据的示例:

Reserve Category    Users   UserDays    Year
S       Research    31       9735        2002
S       Education   71       77          2002
S       Public      0         0          2002
S       Research    58       21596       2003
S       Education   387      509         2003
S       Public      188      219         2003
V       Research    43       642         2012
V       Education   12        60        2012
V       Public      874       2882       2012
V       Research    51        458        2013
V       Education   27        108        2013
V       Public     1003       1932       2013

这是我的代码目前的样子:

library(shiny)
library(tidyverse)
library(ggplot2)
library(dplyr)


ReserveData <- read_csv("DataTotals.csv")
View(ReserveData)


ui <- fluidPage(
  titlePanel("Data Analysis"), 
  sidebarLayout(
    sidebarPanel(
      selectInput("Reserve", "Reserve:", choices = c("S", "V")),
      selectInput("UseStatistic", "Use Statistic:", choices = c("Users",     "UserDays")),
      checkboxGroupInput("Category", label = h3("Category"), 
                     choices = list("Research" = 1, "Education" = 2, "Public" = 3),selected = 1),
      hr(),
      fluidRow(column(3, verbatimTextOutput("Category"))), 
      fluidRow(
        column(4,
               sliderInput("Years", label = h3("Years"), min = 2002, 
                       max = 2017, value = c(2002, 2017))
        )
      ),

      hr(),
      fluidRow(
        column(4, verbatimTextOutput("value")),
        column(4, verbatimTextOutput("Years")))

    ),
    mainPanel(
      tableOutput("Categories"),
      plotOutput(outputId = "distPlot"),
      plotOutput("distPie")
    )
  )
)


server <- function(input, output) {
  output$Categories <- renderTable({
    ReserveDATA <- filter(ReserveData, Reserve == input$Reserve)
    ReserveDATA <- filter(ReserveDATA, Year >= input$Years[1] & Year <=   input$Years[2])
    if(is.null(input$Category))
      return()
    Reserve_Data <- ReserveDATA[input$Category, ]
    Reserve_Data
  })
  output$distPlot <- renderPlot({
    ReserveDATA <- filter(ReserveData, Reserve == input$Reserve)
    ReserveDATA <- filter(ReserveDATA, Year >= input$Years[1] & Year <=    input$Years[2])
    if(is.null(input$Category))
      return()
    Reserve_Data <- ReserveDATA[input$Category, ]
    ggplot(data = Reserve_Data, aes(x=Year, y = input$UseStatistic, fill = Category)) +
      geom_bar(stat = "identity", position=position_dodge())
  })
  output$distPie <- renderPlot({
    ReserveDATA <- filter(ReserveData, Reserve == input$Reserve)
    ReserveDATA <- filter(ReserveDATA, Year >= input$Years[1] & Year <=    input$Years[2])
    pie(ReserveDATA$Users, labels = ReseveDATA$Category)

  })
 }

shinyApp(ui, server)

我不知道为什么当我尝试按类别进行子集化时,我只显示第一年,而不是我正在查看的所有年份。此外,当我尝试显示包含用户和用户天数的条形图时,我没有显示该列中的数字,而是只得到一个显示用户或用户天数的图表(而不是实际数据)。我的饼图目前没有任何显示。

无论如何,任何帮助将不胜感激!

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    在使用名称 ReserveDATA 时,您的代码中存在很多问题,从过滤器到拼写错误。我试图通过数据过滤部分将其减少为单独的reactive。在 Shiny 中使用之前在 RStudio(控制台会话)中检查过滤器始终是一种更好的做法,这使调试更容易,也将确保过滤器首先工作。并尝试在过滤时使用%&gt;% 运算符,因为tidyverse 提供了使数据管道可读和更漂亮的东西。最后,我将ggplot 中的aes 替换为aes_string 以获取字符串输入(直接来自闪亮的用户界面)

    library(shiny)
    library(tidyverse)
    library(ggplot2)
    library(dplyr)
    
    
    ReserveData <- read_csv("DataTotals.csv")
    ##View(ReserveData)
    
    
    ui <- fluidPage(
      titlePanel("Data Analysis"), 
      sidebarLayout(
        sidebarPanel(
          selectInput("Reserve", "Reserve:", choices = c("S", "V")),
          selectInput("UseStatistic", "Use Statistic:", choices = c("Users",     "UserDays")),
          checkboxGroupInput("Category", label = h3("Category"), 
                             choices = list("Research" , "Education" , "Public" ),selected = 'Research'),
          hr(),
          fluidRow(column(3, verbatimTextOutput("Category"))), 
          fluidRow(
            column(4,
                   sliderInput("Years", label = h3("Years"), min = 2002, 
                               max = 2017, value = c(2002, 2017))
            )
          ),
    
          hr(),
          fluidRow(
            column(4, verbatimTextOutput("value")),
            column(4, verbatimTextOutput("Years")))
    
        ),
        mainPanel(
          tableOutput("Categories"),
          plotOutput(outputId = "distPlot"),
          plotOutput("distPie")
        )
      )
    )
    
    
    server <- function(input, output) {
    
      ReserveDATA <- reactive({
        ReserveDATA <- ReserveData %>% filter(Reserve %in% input$Reserve) %>%
          filter(Category %in% input$Category) %>%
          filter(Year >= input$Years[1] & Year <= input$Years[2])
        #cat(input$Years)
        #ReserveDATA <- filter(ReserveData, Reserve == input$Reserve)
        #ReserveDATA <- filter(ReserveDATA, Year >= input$Years[1] & Year <=   input$Years[2])
        if(is.null(input$Category))
          return()
        #Reserve_Data <- ReserveDATA[input$Category, ]
        ReserveDATA
      })
    
    
      output$Categories <- renderTable({
        ReserveDATA()
    
      })
      output$distPlot <- renderPlot({
    
    
        ggplot(data = ReserveDATA(), aes_string(x='Year', y = input$UseStatistic, fill = 'Category')) +
          geom_bar(stat = "identity", position=position_dodge())
      })
      output$distPie <- renderPlot({ 
        pie(ReserveDATA()$Users, labels = ReserveDATA()$Category)
    
      })
    }
    
    shinyApp(ui, server)
    

    【讨论】:

      【解决方案2】:

      第一期:

      checkboxGroupInput 返回选中的选项的值,而不是它们的标签。因此,当您检查“研究”时,您会在input$Category 中获得值“1”,而不是您在尝试像这样子集时所期望的“研究”:Reserve_Data &lt;- ReserveDATA[input$Category, ]。此外,这样的子集也行不通。因此,要解决第一个问题,您可以替换

      Reserve_Data <- ReserveDATA[input$Category, ]
      

      Category_selected <- c( "1"="Research", "2"="Education" , "3"= "Public")[input$Category]
          Reserve_Data <- filter(ReserveDATA,Category==Category_selected)
      

      第二期:

      input$UseStatistic 返回一个字符串,aes 不将字符串理解为列名,因此,ggplot 只显示您的字符串。要解决该问题,您可以替换:

      ggplot(data = Reserve_Data, aes(x=Year, y = input$UseStatistic, fill = Category)) +
            geom_bar(stat = "identity", position=position_dodge())
      

       to.plot <- Reserve_Data  %>% mutate(Year=factor(Year)) %>% rename_(UseStatistic=input$UseStatistic)
      
       ggplot(data = to.plot , aes(x=Year, y = UseStatistic, fill = Category)) +
            geom_bar(stat = "identity", position=position_dodge())
      

      所以,总而言之,如果您更换,您的问题就解决了:

       output$distPlot <- renderPlot({
          ReserveDATA <- filter(ReserveData, Reserve == input$Reserve)
          ReserveDATA <- filter(ReserveDATA, Year >= input$Years[1] & Year <=    input$Years[2])
          if(is.null(input$Category))
            return()
          Reserve_Data <- ReserveDATA[input$Category, ]
          ggplot(data = Reserve_Data, aes(x=Year, y = input$UseStatistic, fill = Category)) +
            geom_bar(stat = "identity", position=position_dodge())
        })
      

      output$distPlot <- renderPlot({
          ReserveDATA <- filter(ReserveData, Reserve == input$Reserve)
      
          ReserveDATA <- filter(ReserveDATA, Year >= input$Years[1] & Year <=    input$Years[2])
      
          if(is.null(input$Category))
            return()
      
          Category_selected <- c( "1"="Research", "2"="Education" , "3"= "Public")[input$Category]
          Reserve_Data <- filter(ReserveDATA,Category==Category_selected)
      
          to.plot <- Reserve_Data  %>% mutate(Year=factor(Year)) %>% rename_(UseStatistic=input$UseStatistic)
      
          ggplot(data = to.plot , aes(x=Year, y = UseStatistic, fill = Category)) +
            geom_bar(stat = "identity", position=position_dodge())
        })
      

      最后,有一个错字。这一行:

      pie(ReserveDATA$Users, labels = ReseveDATA$Category)
      

      应该阅读

      pie(ReserveDATA$Users, labels = ReserveDATA$Category)
      

      【讨论】:

        猜你喜欢
        • 2017-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-24
        • 1970-01-01
        • 1970-01-01
        • 2018-12-20
        • 2020-06-05
        相关资源
        最近更新 更多