#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
выбор зависел от первого. Однако это еще один вопрос, и для такого рода вещей существует множество примеров.