Shiny: Dynamic Number of Output Elements/Plots

萝らか妹 提交于 2019-11-27 22:55:02

Inspired from this, you could do:

ui.R

shinyUI(pageWithSidebar(            
        headerPanel("Dynamic number of plots"),            
        sidebarPanel(
                selectInput(inputId = "choosevar",
                            label = "Choose Cut Variable:",
                            choices = c("Nr. of Gears"="gear", "Nr. of Carburators"="carb"))
        ),            
        mainPanel(
                # This is the dynamic UI for the plots
                uiOutput("plots")
        )
))

server.R

library(googleVis)
shinyServer(function(input, output) {
        #dynamically create the right number of htmlOutput
        output$plots <- renderUI({
                plot_output_list <- lapply(unique(mtcars[,input$choosevar]), function(i) {
                        plotname <- paste0("plot", i)
                        htmlOutput(plotname)
                })

                tagList(plot_output_list)
        }) 

        # Call renderPlot for each one. Plots are only actually generated when they
        # are visible on the web page. 


        for (i in 1:max(unique(mtcars[,"gear"]),unique(mtcars[,"carb"]))) {
                local({
                        my_i <- i
                        plotname <- paste0("plot", my_i)

                        output[[plotname]] <- renderGvis({
                                data <- mtcars[mtcars[,input$choosevar]==my_i,]
                                if(dim(data)[1]>0){
                                gvisColumnChart(    
                                        data, xvar='hp', yvar='mpg' 
                                )}
                                else NULL
                        })  
                })
        }

})

It basically creates htmlOutput plots dynamically and binds the googleVis plots when there is data in the subset.

Luke Hankins

Have you tried making a total of 9 (6+3) conditionalPanels? If yes, have you tried 3 naked output panels that have conditionals inside them to switch between the plots, and 3 additional conditionalPanels for the non-overlapped plots?

Another way might be to make a single output panel with an internal conditional, and then stack your 3 or 6 plots into a single plot ala

if(cond1) {
   par(mfrow=c(3,1))
   plot1
   plot2
   plot3
} else {
   par(mfrow=c(3,2))
   plot1
   plot2
   plot3
   plot4
   plot5
   plot6
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!