2016-06-18 10 views
1

Ich habe eine glänzende Anwendung und ich habe die folgenden conditionalPanel ‚s erstellt:Zwei conditionalPanel der in Shiny

conditionalPanel(condition="output.levels", 
         numericInput("centerpoints", "Number of center points", value=0, min=0, max=25)), 
    conditionalPanel(condition="!output.levels", 
        numericInput("centerpoints", "Number of center points", value=0, min=0, max=0)) 

Wenn output.levels TRUE I zwischen 0 und 25 Mittelpunkte auswählen möchten. Andernfalls muss die Anzahl der Mittelpunkt 0 sein.

Das Problem ist, dass wenn die Bedingung WAHR ist, ich mehr als 0 Mittelpunkte auswählen und dann die Bedingung wird FALSE, behält Shiny die zuvor ausgewählten Mittelpunkte anstelle von 0 .

Gibt es eine Möglichkeit, es zu beheben? Danke.

Antwort

4

Das Problem, mit dem Sie konfrontiert sind, kommt von zwei fast identische Elemente in Ihrem UI, die die gleiche ID teilen. Bedingte Bereiche verbergen nur Ihre Elemente, aber sie sind immer noch im Dokument vorhanden. So wird Ihre erste numericInput immer die von Shiny registrierte sein und die zweite wird nicht gebunden (d. H. Wird ihre Eingabe nicht senden) wegen der doppelten ID an Shiny.

Ich rate Ihnen, die Situation auf andere Weise zu implementieren. Es gibt Funktionen in Shiny, mit denen Sie ein vorhandenes ui-Element ändern können, wenn die App vollständig eingerichtet ist. Diese Funktionen sind updateXxxInput und Sie können jede Variable ändern, die in dem entsprechenden Eingabeelement vorhanden ist. Da Ihr einziges Ziel ist, den max Wert des numericInput zu ändern, können wir dies einfach vom Server aus tun, wo wir observe die levels oder jede andere Variable können. Im folgenden Code habe ich ein einfaches Kontrollkästchen verwendet. Der Befehl zum Ändern des Werts max lautet updateNumericInput(session, "centerpoints", max = 0). Beachten Sie, dass dies nur das eine Attribut Ihrer Eingabe ändert. Dies ist ein großer Vorteil gegenüber dem erneuten Rendering von UI-Elementen, da Sie nicht verfolgen müssen, was alle anderen Attribute sind.

Die updateXxxInput Funktionen sind sehr nützlich, also probieren Sie es aus!

library(shiny) 

ui <- shinyUI(
    fluidPage(
    numericInput("centerpoints", "Number of center points", value=0, min=0, max=25), 
    checkboxInput("changeCenterpoints", "Cap maximum at 0") 
) 
) 

server <- function(input, output, session){ 
    observeEvent(input$changeCenterpoints, { 
    if(input$changeCenterpoints){ 
     updateNumericInput(session, "centerpoints", max = 0, value = 0) 
    }else{ 
     updateNumericInput(session, "centerpoints", max = 25) 
    } 
    }) 
} 

shinyApp(ui, server) 
+0

Vielen Dank! Ich werde es mit UpdateXxxInput Funktionen versuchen. – Marta

Verwandte Themen