0
votes

So I'm trying to create a shiny app to visualize some probability functions. I've got an old version (which works) with some very heavy code and now I want to update it using the switch functions. But my plot does not seem to respond very well to that.

I've tried to use the req() function to force the update of the data. But then I thought that maybe the problem was I just can't use the same name for the plot in two panels.

ui <- dashboardPage(
    dashboardHeader(title = "probability laws"),
    dashboardSidebar(
        sidebarMenu(id='menus',
                    menuItem(text = "Plotting some densities" , icon = icon("atlas"),tabName = "density"),
                    menuItem(text = "repartition functions", icon = icon("cog", lib = 'glyphicon'),tabName = "repartition")
        )
    ),
    dashboardBody(
        tabItems(
            tabItem("density",
                    fluidRow(
                        tabsetPanel(id = 'tabs',
                                    tabPanel(title='uniforme',value='unif',fluidRow(
                                        column(8, plotOutput('graphe')),
                                        column(3,wellPanel(
                                            sliderInput(inputId = "inf",label = "borne inf",min = -10,max = 10,value = 0,step = 0.2),br(),
                                            sliderInput(inputId = "sup",label = "borne sup",min = -10,max = 10,value = 1,step = 0.2),br())
                                    ))),
                                    tabPanel(title='normale',value='norm',fluidRow(
                                        column(8, plotOutput('graphe')),
                                        column(3,wellPanel(
                                            sliderInput(inputId = "mu",label = "mean",min = -10,max = 10,value = 0,step = 0.2),br(),
                                            sliderInput(inputId = "var",label = "variance",min = 0,max = 10,value = 1,step = 0.2),br())
                                        )))
                                    
                    )
            )))))

And in the server:


server <- function(input, output,session) {
    
    x <- reactive({switch (input$tabs,
                           'unif' = seq(-10,10,0.1),
                           'norm' = seq(-10,10,0.1)
    )})
    
    data <- reactive({switch(input$tabs,
                                   'unif' = dunif(x(),0,1),
                                   'norm' = dnorm(x(),0,1)
                                    )})
    
    data2 <- reactive({switch(input$tabs,
                              'unif' = dunif(x(),min(input$inf, input$sup),max(input$inf,input$sup)),
                              'norm' = dnorm(x(), input$mu, sqrt(input$var)) 
     )})
    
    output$graphe <- renderPlot({df <- melt(data.frame(x(),data(),data2()), id='x..')
                                 ggplot(data=df, aes(x=x.., y=value, colour=variable)) + geom_line() + xlim(-10,10) + ylim(0,1) + theme(legend.position = 'none')
                                })
    
}

The thing is R doesn't find any error, and if I just keep the unif part it works. But when I add the normal distribution panel I'm left with a blank space. Any help is greatly appreciated.

1
You cannot have plotOutput('graphe') two times in the same app. - Stéphane Laurent
I wasn't sure to be allowed to do that so thanks for the clarification. So is there a function to get around this restriction or should I just make all the plots by myself with output$graphe1 etc ? - tanglef

1 Answers

0
votes

So with some research I solved this by using graphe1 and graph2 like :

output$graphe1 <- output$graphe2 <- renderPlot(...)

Thank you @Stéphane_Laurent for pointing out where the mistake was.