Как построить график из реактивной таблицы с 2 входами? R Блестящий

#r #shiny #shinydashboard #flexdashboard

Вопрос:

Я создаю небольшое веб-приложение, которое ежемесячно отслеживает претензии организации или проекта. У меня есть фрейм данных в «длинном» формате, и я смог получить некоторые значения, но мне очень трудно построить простую гистограмму, которая показывает количество по месяцам.

Моя цель состоит в том, чтобы обновить таблицу на основе входных данных. Таким образом, если выбрана 1 организация, то на графике отображаются только значения этой организации.

Вот скриншот введите описание изображения здесь

 ---
title: "Untitled"
output: 
          flexdashboard::flex_dashboard:
            orientation: columns
            vertical_layout: fill
            graphics: yes
            runtime: shiny
---

```{r setup, include=FALSE}
        library(flexdashboard)
        library(ggplot2)
        library(plotly)
        library(DT)
        library(htmltools)
        library(readr)
        library(shiny)
        library(knitr)



monthly_claims <- data.frame(OrgName = c("Alpha","Alpha","Alpha","Alpha","Alpha","Alpha","Alpha","Alpha", 
                                         "Beta","Beta","Beta","Beta","Beta","Beta","Beta","Beta","Beta",
                                         "Delta","Delta","Delta","Delta","Delta","Delta","Delta","Delta"),
                             Claimed_By_Project = c("Alpha 1","Alpha 1","Alpha 2","Alpha 2","Alpha 2","Alpha 3","Alpha 3","Alpha 3",
                                                    "Beta 1","Beta 1","Beta 1","Beta 1","Beta 2","Beta 2","Beta 2","Beta 2","Beta 2",
                                                    "Delta 1","Delta 1","Delta 1","Delta 1","Delta 2","Delta 2","Delta 2","Delta 2"),
                             Month_Claimed = c(1,1,1,2,2,2,3,3,3,
                                               1,2,2,2,2,3,3,3,3,
                                               1,1,1,1,2,2,3

                             ))

```

Inputs {.sidebar data-width=300}
=====================================



```{r}
selectInput("input_type","Select Organization: ", c("All", monthly_claims$OrgName))
selectInput("input_type2", "Select Project: ", c("All", monthly_claims$Claimed_By_Project))


claims <- reactive({
  mc <- monthly_claims
  if(input$input_type !="All")
    mc <- subset(mc, OrgName == input$input_type)
  if(input$input_type2 !="All")
    mc <- subset(mc, Claimed_By_Project == input$input_type2)
  mc
})



```

# Page 1 


### Bar Graph by Month??

```{r}

data <- as.data.frame(table(monthly_claims$Month_Claimed))

ggplot(data, aes(Var1, Freq))   
      geom_bar(stat = "identity")


````
 

данные

 monthly_claims <- data.frame(OrgName = c("Alpha","Alpha","Alpha","Alpha","Alpha","Alpha","Alpha","Alpha", 
                                         "Beta","Beta","Beta","Beta","Beta","Beta","Beta","Beta","Beta",
                                         "Delta","Delta","Delta","Delta","Delta","Delta","Delta","Delta"),
                             Claimed_By_Project = c("Alpha 1","Alpha 1","Alpha 2","Alpha 2","Alpha 2","Alpha 3","Alpha 3","Alpha 3",
                                                    "Beta 1","Beta 1","Beta 1","Beta 1","Beta 2","Beta 2","Beta 2","Beta 2","Beta 2",
                                                    "Delta 1","Delta 1","Delta 1","Delta 1","Delta 2","Delta 2","Delta 2","Delta 2"),
                             Month_Claimed = c(1,1,1,2,2,2,3,3,3,
                                               1,2,2,2,2,3,3,3,3,
                                               1,1,1,1,2,2,3

                             ))
 

Ответ №1:

Вам просто нужно, чтобы ваша гистограмма имела реактивную зависимость от claims . например.,

 ggplot(claims(), aes(x = Month_Claimed))   
    geom_bar()
 

Это блестящий для начинающих, я думаю, что вы получите некоторую пользу от прохождения некоторых вводных курсов здесь.

Например, вам также понадобится plotOutput и renderPlot . Полный минимальный пример ниже.

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

ui <- fluidPage(
    selectInput("input_type",
        "Select Organization: ",
        choices = c("All", monthly_claims$OrgName)
    ),
    selectInput("input_type2",
        "Select Project: ",
        choices = c("All", monthly_claims$Claimed_By_Project)
    ),
    plotOutput("plt")    
)

server <- function(input, output, session) {
    
    claims <- reactive({
        mc <- mutate(monthly_claims, Month_Claimed = factor(Month_Claimed)
        if(input$input_type !="All")
            mc <- subset(mc, OrgName == input$input_type)
        if(input$input_type2 !="All")
            mc <- subset(mc, Claimed_By_Project == input$input_type2)
        mc
    })
    
    output$plt <- renderPlot({
        ggplot(claims(), aes(x = Month_Claimed))   
            geom_bar()
    })
}

shinyApp(ui, server)
 

У вас возникнут проблемы с получением комбинаций двух несуществующих переменных фильтра, поэтому вы можете подумать о том, чтобы второй selectInput выбор зависел от первого. Однако это еще один вопрос, и для такого рода вещей существует множество примеров.