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.
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)
perfekt funktioniert! Vielen Dank für deine Hilfe! –