2015-07-28 11 views
5

Ich möchte eine reaktive Anzeige erstellen, die eine unterschiedliche Anzahl von Plots anzeigt, je nachdem, welcher Wert des Eingangswählers gewählt wird. Im Fall des Datensatzes mtcars möchte ich sagen, dass ich den Benutzer zwischen dem Schneiden durch Nr. Wählen lassen möchte. von Gears oder Nr. von Carburatos für die zu produzierenden Grundstücke.Glänzend: Dynamische Anzahl der Ausgabeelemente/Plots

bei unique(mtcars$gear) Blick sehen wir es 4 3 5 so 3 mögliche Werte hat, während unique(mtcars$carb)4 1 2 3 6 8 so 6 mögliche Werte hat. Ich möchte daher 6 separate Plots erstellen, wenn Nr. of Carburators ausgewählt ist und nur 3 Plots, wenn Nr. of Gears ausgewählt ist. Ich habe mit conditionalPanel gespielt, aber es explodiert immer, wenn ich einmal oder zweimal zwischen Selektoren umschalte. Hilfe?

Shiny UI:

library(shiny) 
library(googleVis) 

shinyUI(bootstrapPage(
    selectInput(inputId = "choosevar", 
       label = "Choose Cut Variable:", 
       choices = c("Nr. of Gears"="gear", 
          "Nr. of Carburators"="carb")), 
    htmlOutput('mydisplay') ##Obviously I'll want more than one of these... 
# conditionalPanel(...) 
)) 

Shiny Server:

shinyServer(function(input, output) { 
    #Toy output example for one out of 3 unique gear values: 
    output$mydisplay <- renderGvis({ 
    gvisColumnChart( 
    mtcars[mtcars$gear==4,], xvar='hp', yvar='mpg' 
    ) 
    }) 
}) 

Antwort

5

von this inspiriert, könnten Sie tun:

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 
         }) 
       }) 
     } 

}) 

Es erstellt grundsätzlich htmlOutput Plots dynamisch und bindet die googleVis Plots, wenn Daten in der Teilmenge vorhanden sind.

+1

Wow, die Tagliste ist, was ich die ganze Zeit vermisst habe. Vielen Dank! –

0

Haben Sie versucht, insgesamt 9 (6 + 3) conditionalPanels zu machen? Wenn ja, haben Sie 3 nackte Ausgabe-Panels mit Bedingungszeichen in ihnen versucht, um zwischen den Plots zu wechseln, und 3 zusätzliche conditionalPanels für die nicht überlappenden Plots?

könnte andere Möglichkeit, einen einzelnen Ausgabe-Panel mit einer internen davon abhängig zu machen, sein, und dann 3 oder 6 Plots in ein einziges Grundstück stapelt ala

if(cond1) { 
    par(mfrow=c(3,1)) 
    plot1 
    plot2 
    plot3 
} else { 
    par(mfrow=c(3,2)) 
    plot1 
    plot2 
    plot3 
    plot4 
    plot5 
    plot6 
} 
Verwandte Themen