2016-08-23 3 views
1

Ich frage mich, ob es möglich war, den Wert einer numerischen Eingabe über updateNumericInput auf 0 zu setzen, wenn ein Kontrollkästchen nicht angeklickt wurde. Unten ist, wie mein Code im Moment eingerichtet wird, um die Kontrollkästchen und numerische Eingaben zu generieren. Ich musste Schleifen verwenden, um eine dynamische Anzahl von Kontrollkästchen und Eingaben aufgrund der Art der App zu erstellen, so würde ich wirklich jede Hilfe schätzen, die beide verbindet, während ich die Funktionalität behalte.Numerische Eingaben in 0 ändern, wenn das Kontrollkästchen deaktiviert ist

Server-Datei:

shinyServer(function(input, output, session) { 

    output$inputs1 <- renderUI({ 
    numSliders <- input$sources 
    lapply(1:numSliders, function(i) { 
     numericInput(
     inputId = paste0('slider1', i), 
     label = df[i,2], 
     value = df[i,3]*(input$budget)/100) 
    }) 
    }) 

    output$checks1 <- renderUI({ 
    numSliders <- input$sources 
    lapply(1:numSliders, function(i) { 
     checkboxInput(
     inputId = paste0('check1', i), 
     label = df[i,2], 
     value = TRUE 
     ) 
    }) 
    }) 
} 

UI:

shinyUI(fluidPage(fluidRow(
    sidebarLayout(
     sidebarPanel(
     column(5,numericInput("budget", "Budget", value = 0), 
      uiOutput("checks1")), 
     column(5,uiOutput("inputs1"))), 
     mainPanel() 
    ) 
) 
) 
) 

Bitte lassen Sie mich wissen, ob es irgendeine Art von Abhilfe für dieses ist.

Vielen Dank im Voraus!

Antwort

0

Da kann man nur eine endliche Anzahl von Widgets erzeugen die einfachste Möglichkeit, eine observer für jede checkboxInput schaffen ist eine globale Variable zu erstellen, sagen wir, max_widgets, die eine obere Schranke für Widgets gibt. Sie dann den Maximalwert von numericInput beschränken, die eine Reihe von Widgets zu max_widgets steuert (so input$sources) und innerhalb renderUI s verlangen, dass

req(numSliders > 0 & numSliders <= max_widgets) 

(ich würde verwenden validate und need die Benutzer zu informieren, dass die Anzahl von Widgets hat als nicht negativ und wird max_widgets aber in meiner glänzenden Version es gebunden ist ein Fehler und validate funktioniert nicht wie angenommen)

Sie für jeden checkboxInput auf der Serverseite erstellen Beobachter dann:.

lapply(1:max_widgets, function(i) { 
     observeEvent(input[[paste0('check', i)]], { 
      print(paste0("update of numeric", i)) 
      updateNumericInput(session, inputId = paste0('numeric', i), 
           value = 0) 
     }) 
    }) 

Beachten Sie, dass diese Beobachter für alle möglichen Kontrollkästchen schaffen wird (Kontrollkästchen nicht einmal existieren können - glänzend nicht beschweren :))

Dies aber nicht perfekt sein kann, wie gesagt, haben Sie nur ein Beobachter für jedes Kontrollkästchen.

Wenn Sie dynamisch Beobachter in einer folgenden Art und Weise erzeugen (ohne eine globale Variable max_widgets)

observe({ 
    lapply(1:input$sources, function(i) { 
     observeEvent(input[[paste0('check', i)]], { 
      print(paste0("numeric", i, " = ", input[[paste0('numeric', i)]])) 
      updateNumericInput(session, inputId = paste0('numeric', i), 
           value = 0) 
     }) 
    }) 

es wird auch funktionieren, aber jedes Mal, werden Sie neue Widgets erzeugen Sie auch einen Beobachter dafür erstellen. So können Sie mehrere Beobachter für jede checkboxInput erhalten! Wenn Ihre App klein ist, wird es nicht viel ausmachen, aber im Allgemeinen kann es zu Fehlern führen. Sie können leicht damit umgehen, aber es macht den Code etwas komplizierter - es gab eine question, die dieses Problem berührte.




enter image description here


Voll Beispiel:

library(shiny) 
rm(list = ls()) 

max_widgets <- 15 

server <- shinyServer(function(input, output, session) { 

    output$inputs1 <- renderUI({ 

    numSliders <- input$sources 
    # My shiny version has a bug and can't use validate(need(...)) because 
    # it doesn't work as suppossed 
    req(numSliders > 0 & numSliders <= max_widgets) 

    lapply(1:numSliders, function(i) { 
     numericInput(
     inputId = paste0('numeric', i), 
     # label = df[i,2], 
     paste0("Input ", i), 
     # value = df[i,3] * (input$budget)/100) 
     value = i * (input$budget)/100) 
    }) 

    }) 

    output$checks1 <- renderUI({ 

    numSliders <- input$sources 
    req(numSliders > 0 & numSliders <= max_widgets) 

    lapply(1:numSliders, function(i) { 
     list(
     checkboxInput(
      inputId = paste0('check', i), 
      # label = df[i,2], 
      label = paste0("Checkbox ", i), 
      value = TRUE 
     ), 
     br() 
    ) 
    }) 

    }) 

    lapply(1:max_widgets, function(i) { 
     observeEvent(input[[paste0('check', i)]], { 
      print(paste0("update of numeric", i)) 
      updateNumericInput(session, inputId = paste0('numeric', i), 
           value = 0) 
     }) 
    }) 

}) 

ui <- shinyUI(fluidPage(fluidRow(
    sidebarLayout(
    sidebarPanel(
     column(5, 
     numericInput("budget", "Budget", value = 0), 
     hr(), 
     br(), 
     uiOutput("checks1") 
    ), 
     column(5, 
     numericInput("sources", "Sources", value = 0, min = 0, max = max_widgets), 
     hr(), 
     uiOutput("inputs1") 
    ) 
    ), 
    mainPanel() 
) 
))) 
shinyApp(ui, server) 
+1

perfekt funktioniert! Vielen Dank für deine Hilfe! –

Verwandte Themen