2016-07-14 15 views
0

Lassen Sie uns die einfache Tutorial Beispiel von einigen conditionalPanels erweitert betrachten, wie ich verstanden sie könnten/solltenconditionalPanel zeigt seltsame Verhalten

library(shiny) 
library(shinydashboard) 

ui <- fluidPage(
    titlePanel("censusVis"), 

    sidebarLayout(
    sidebarPanel(
     helpText("Create demographic maps with 
       information from the 2010 US Census."), 
     selectInput("var", 
        label = "Choose a variable to display", 
        choices = list("Percent White" = 1, 
           "Percent Black" = 2, 
           "Percent Hispanic" = 3), 
        selected = 1 
       ), 
     conditionalPanel(condition = "input.var == 1", 
         sliderInput("range", label = "Range of interest:", min = 0, max = 10, value = c(0, 10)) 
    ), 
     conditionalPanel(condition = "input.var == 2", 
         sliderInput("range", label = "Range of interest:", min = 0, max = 20, value = c(0, 20)) 
    ), 
     conditionalPanel(condition = "input.var == 3", 
         sliderInput("range", label = "Range of interest:", min = 0, max = 30, value = c(0, 30)) 
    ) 
    ), 
    mainPanel(
     textOutput("text1"), 
     textOutput("text2") 
    ) 
) 
) 
server <- function(input, output) { 
    output$text1 <- renderText({ 
    paste("You have selected", input$var) 
    }) 

    output$text2 <- renderText({ 
    paste("You have chosen a range that goes from", 
      input$range[1], "to", input$range[2]) 
    }) 


    } 

shinyApp(ui, server) 

Wie erwartet verwendet werden, wenn ich den Regler bewegen, die ändert sich. Aber wenn ich eine andere Auswahl mache und dann den Schieberegler verschiebe, ändert sich die Ausgabe nicht. Habe ich das conditionalPanel als eine Art von if itself falls missverstanden oder wie soll mein Beispiel geändert werden?

Meine aktuelle Lösung wäre, jedem Schieberegler eine eindeutige EingabeID zu geben und eine if else if-Bedingung w.r.t "var" auf der Serverseite zu verwenden. Aber für viele Möglichkeiten wird das ziemlich unangenehm.

Antwort

0

Sie können dies vermeiden, indem eine reactive Erklärung Hinzufügen und verschiedenen ids-sliderInput in conditionalPanel zuweisen:

library(shiny) 
library(shinydashboard) 

ui <- fluidPage(
     titlePanel("censusVis"), 

sidebarLayout(
sidebarPanel(
    helpText("Create demographic maps with 
      information from the 2010 US Census."), 
    selectInput("var", 
       label = "Choose a variable to display", 
       choices = list("Percent White" = 1, 
          "Percent Black" = 2, 
          "Percent Hispanic" = 3), 
       selected = 1 
), 
    conditionalPanel(condition = "input.var == 1", 
        sliderInput("range1", label = "Range of interest:", min = 0, 
           max = 10, value = c(0, 10)) 
), 
    conditionalPanel(condition = "input.var == 2", 
        sliderInput("range2", label = "Range of interest:", min = 0, 
           max = 20, value = c(0, 20)) 
), 
    conditionalPanel(condition = "input.var == 3", 
        sliderInput("range3", label = "Range of interest:", min = 0, 
           max = 30, value = c(0, 30)) 
) 
), 
mainPanel(
    textOutput("text1"), 
    textOutput("text2") 
))) 

server <- function(input, output) { 

    someName <- reactive({ 
        switch(input$var, 
          "1" = input$range1, 
          "2" = input$range2, 
          "3" = input$range3) 
         }) 

output$text1 <- renderText({ 
paste("You have selected", input$var) 
}) 

output$text2 <- renderText({ 
paste("You have chosen a range that goes from", 
     someName()[1], "to", someName()[2]) 
}) 


} 

shinyApp(ui, server) 
+0

Das ist eine sehr elegante Lösung. Vielen Dank. – Pascal

+0

Eine andere Sache ... wie würde das funktionieren, wenn ich ConditionalPanels verschachtelt hätte? – Pascal

+0

Nevermind, ich habe nur einen anderen Ansatz verwendet. – Pascal