既然你只能產生有限數量的小工具創建每個checkboxInput
一個observer
的最簡單的方法是創建一個全局變量,比方說,max_widgets
這給小部件的上限。然後,限制numericInput
最大值控制多個小部件來max_widgets
(所以input$sources
)和內renderUI
小號要求
req(numSliders > 0 & numSliders <= max_widgets)
(我會使用validate
和need
來通知件的數量有用戶爲非負,勢必max_widgets
但在我閃亮的版本有一個bug和validate
像預想的那樣不起作用)
然後,爲在服務器端每個checkboxInput
創建觀察家:
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)
})
})
注意,這將創造觀察員所有可能的複選框(複選框可能根本不存在 - 閃亮不會抱怨:))
這可能不是完美的,但,正如所說,你將有隻有一個觀察者爲每個複選框。
如果動態生成的方式如下觀察員(沒有一個全局變量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)
})
})
,將工作太多,但每次都會產生新的小部件也將建立一個觀察者它。所以你可能會爲每個checkboxInput
獲得多個觀察者! 如果你的應用程序很小,那麼它並不重要,但通常它可能會導致錯誤。你可以很容易地處理它,但它會使代碼稍微複雜一些 - 有一個觸及這個問題的question。
完整的示例:
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)
完美地工作!非常感謝你的幫助! –