有限個のウィジェットしか生成できないため、それぞれのcheckboxInput
に対してobserver
を作成する最も簡単な方法は、ウィジェットの上限を与えるグローバル変数、たとえばmax_widgets
を作成することです。その後、(そうinput$sources
)max_widgets
へのウィジェットの数を制御numericInput
の最大値を制限し、
req(numSliders > 0 & numSliders <= max_widgets)
は(私はvalidate
とneed
は、ウィジェットの数が持っているユーザーに通知するために使用することrenderUI
秒以内に必要そこにバグがあると想定してvalidate
が動作しない非負とmax_widgets
に私の光沢のあるバージョンにバインドされていなければ)あなたは、サーバー側で各checkboxInput
のためのオブザーバーを作成
:。
012これはすべての可能なチェックボックスのためのオブザーバーを作成することをは
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)
!あなたの助けをありがとう! –