2015-07-28 10 views
5

Chcę ustawić wyświetlacz reaktywny, aby wyświetlał inną liczbę działek w zależności od wybranej wartości selektora wejścia. W przypadku zbioru danych mtcars, załóżmy, że chcę, aby użytkownik wybrał między skrawaniem według numeru. Gears lub Nr. Carburatos dla działek, które zostaną wyprodukowane.Shiny: Dynamiczna liczba elementów wyjściowych/działek

Patrząc na unique(mtcars$gear) widzimy, że ma 4 3 5, więc 3 możliwe wartości, a unique(mtcars$carb) ma 4 1 2 3 6 8, więc 6 możliwych wartości. Dlatego chcę utworzyć 6 oddzielnych działek po wybraniu Nr. of Carburators i tylko 3 działki po wybraniu Nr. of Gears. Grałem z conditionalPanel, ale niezmiennie wysadza się po przełączeniu między selektorami raz lub dwa razy. Wsparcie?

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 Serwer:

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

Odpowiedz

5

inspirowany this, można zrobić:

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

}) 

Generalnie tworzy wykresy htmlOutput dynamicznie i wiąże wykresy googleVis, gdy są dane w podzbiorze.

+1

Wow, tagList jest tym, czego mi brakowało przez cały czas. Wielkie dzięki! –

0

Czy próbowałeś co daje w sumie 9 (6 + 3) conditionalPanels? Jeśli tak, czy wypróbowałeś 3 nagie panele wyjściowe, które mają w sobie warianty, aby przełączać się pomiędzy działkami, i 3 dodatkowe panele warunkowe dla niepowiązanych wykresów?

Innym sposobem może być do jednego panelu wyjściowego z wewnętrznym warunkowe, a następnie układać swoje 3 lub 6 działek w jednej działce ala

if(cond1) { 
    par(mfrow=c(3,1)) 
    plot1 
    plot2 
    plot3 
} else { 
    par(mfrow=c(3,2)) 
    plot1 
    plot2 
    plot3 
    plot4 
    plot5 
    plot6 
} 
Powiązane problemy