2015-07-28 4 views
5

Я хочу сделать реактивный дисплей, что отображает другое количество графиков в зависимости от того, какое значение выбрано для выбора входа. В случае набора данных mtcars, допустим, я хочу, чтобы пользователь выбирал междурезание на Nr. из передач или Nr. Carburatos для участков, которые будут произведены.Блестящий: динамическое число выходных элементов/графиков

Глядя на unique(mtcars$gear), мы видим, что оно имеет 4 3 5, поэтому 3 возможных значения, а unique(mtcars$carb) имеет 4 1 2 3 6 8, поэтому 6 возможных значений. Поэтому я хочу создать 6 отдельных графиков, если выбрано Nr. of Carburators и выбрано только 3 графика, когда выбрано Nr. of Gears. Я играл с conditionalPanel, но он неизменно взрывается после того, как я переключаюсь между селекторами один или два раза. Помогите?

Блестящая 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(...) 
)) 

Блестящая Сервер:

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

ответ

5

Вдохновленный из this, вы могли бы сделать:

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

}) 

Он в основном создает htmlOutput участки динамически и связывает графики googleVis, когда есть данные в подмножестве.

+1

Wow, tagList - это то, что я пропал без вести. Огромное спасибо! –

0

Вы пытались сделать в общей сложности 9 (6 + 3) conditionalPanels? Если да, попробовали ли вы 3 голые панели вывода, у которых есть условные условия для переключения между графиками и 3 дополнительных условных поля для неперекрывающихся графиков?

Другой способ может быть, чтобы один выходной панели с внутренним условна, а затем складывать ваши 3 или 6 участков в единый сюжет аля

if(cond1) { 
    par(mfrow=c(3,1)) 
    plot1 
    plot2 
    plot3 
} else { 
    par(mfrow=c(3,2)) 
    plot1 
    plot2 
    plot3 
    plot4 
    plot5 
    plot6 
} 
Смежные вопросы