2017-06-26 5 views
0

grâce à vos réponses, j'ai réussi à faire un barplot qui réagit en fonction de l'unité de temps (Semaine, Mois, Année) et agrège données par unité de temps (le lien est ici): R Shiny - How to create a barplot that reacts according to the time unit (Week, Month, Year) and agregates data by time unitR Shiny - Comment utiliser la fonction "fonte" (package reshape2) pour créer un barplot empilé

Ensuite, je souhaite faire un barplot empilé avec deux variables. Pour cela, je génère la trame de données suivante avec deux variables (c'est-à-dire dans mon exemple: Imported_cases et Nativethonous_ases) et j'applique la fonction "fondre". L'interface utilisateur est ici:

library(shiny) 
library(dplyr) 
library(lubridate) 
library(ggplot2) 
library(scales) 
library(reshape2) 

Disease <- data.frame(
    Date = seq(as.Date("2015/1/1"), as.Date("2017/1/1"), "days"), 
    Imported_cases = rep(1),Autochtonous_cases=rep(2)) 
Disease <- Disease %>% mutate(
    Week = format(Date, "%Y-%m-%U"), 
    Month = format(Date, "%Y-%m"), Year = format(Date, "%Y")) 
Disease<- melt(Disease, id = c("Date","Week","Month","Year"), 
       measured = c("Imported_cases", "Autochtonous_cases")) 
print(head(Disease)) 

ui <- fluidPage(
     dateRangeInput("daterange", "Choice the date", 
        start = min(Disease$Date), 
        end = max(Disease$Date), 
        min = min(Disease$Date), 
        max = max(Disease$Date), 
        separator = " - ", format = "dd/mm/yy", 
        startview = 'Month', language = 'fr', weekstart = 1), 
     selectInput(inputId = 'Time_unit', 
        label = 'Time_unit', 
        choices = c('Week', 'Month', 'Year'), 
        selected = 'Month'), 
        plotOutput("Disease")) 

Lorsque j'exécute mon serveur, R Shiny affiche: L'objet d'erreur 'variable' est introuvable. Vous trouverez ci-dessous le code du serveur:

server <- function(input, output) { 
dateRangeInput <- reactive({ 
dataset <- subset(
    Disease, Date >= input$daterange[1] & Date <= input$daterange[2]) 
dataset 
}) 

selectInput = reactive({ 
dataset <- dateRangeInput() %>% group_by_(input$Time_unit) %>% 
    summarise(Sum = sum(value)) 
dataset 
}) 

output$Disease <-renderPlot({ 
       ggplot(data=selectInput(), 
       aes_string(x = input$Time_unit, y = "Sum", 
          fill = "variable")) + 
       geom_bar(stat = "identity") 
       }) 

} 
shinyApp (ui = ui, server = server) 

Je ne sais pas si le problème est le code de selectInput ou le code de output$Disease. Je ne comprends pas pourquoi Shiny ne trouve pas "variable" (cf print (head (Maladie)) Merci pour votre aide (j'espère être clair)

+0

J'ai oublié de dire: Bonjour! – Pascal

Répondre

2

Hier c'est le code qui va marcher et créer l'intrigue à barres empilées.

library(shiny) 
library(dplyr) 
library(lubridate) 
library(ggplot2) 
library(scales) 
library(reshape2) 

Disease<-data.frame(Date=seq(as.Date("2015/1/1"), as.Date("2017/1/1"), "days"),Cases=rep(1),Autochtonous_cases=rep(2)) 
Disease <- Disease %>% mutate(Week = format(Date, "%Y-%m-%U"),Month = format(Date, "%Y-%m"), Year = format(Date, "%Y")) 
Disease<-melt(Disease,id=c("Date","Week","Month","Year")) # just id 


ui <- fluidPage(
    dateRangeInput("daterange", "Choice the date", 
       start = min(Disease$Date), 
       end = max(Disease$Date), 
       min = min(Disease$Date), 
       max = max(Disease$Date), 
       separator = " - ", format = "dd/mm/yy", 
       startview = 'Month', language = 'fr', weekstart = 1), 
    selectInput(inputId = 'Time_unit', 
       label='Time_unit', 
       choices=c('Week','Month','Year'), 
       selected='Month'), 
    plotOutput("Disease")) 


server <- function(input, output) { 
    dateRangeInput<-reactive({ 
    dataset <- subset(Disease, Date >= input$daterange[1] & Date <= input$daterange[2]) 
    dataset 
    }) 
    selectInput= reactive({ 
    dataset <- dateRangeInput() %>% group_by_(input$Time_unit,"variable") %>% summarise(Sum = sum(value)) #I have added here grouping as variable 
    print(head(dataset)) 
    dataset 
    }) 

    output$Disease <-renderPlot({ 
    ggplot(data=selectInput(), aes_string(x=input$Time_unit,y="Sum", fill = "variable")) + geom_bar(stat="identity") + 
     labs(title="Disease", y ="Number of cases") + 
     theme_classic() + 
     theme(plot.title = element_text(hjust = 0.5)) 
    }) 

} 
shinyApp (ui = ui, server = server) 

Je suppose que cela est ce que vous cherchez Vous avez eu de petites erreurs dans la fonction melt, la mise en place des variables de id est assez juste, deuxième chose est de considérer la colonne variable créée dans group_by_ (comme vous voulez obtenir le nombre de cas et les cas autochtones), et le dernier utilise la variable comme fill argument dans ggplot

+0

À Malvina_a. Je vous remercie sincèrement. Maintenant, je comprends mes erreurs (juste id pour la fonction de fusion et group_by _ (....., "variable") .C'est exactement ce que je veux.J'espère que vos réponses aideront d'autres personnes.Merci beaucoup.Pascal – Pascal