我目前正致力于使用R Shiny构建的Web应用程序,该应用程序的功能基于动态创建的UI,包括呈现其他输入字段,即selectInput
。 inputId
的{{1}}属性也是动态创建的,我无法预定义创建的selectInputs
的数量,因为它也会根据用户的输入而变化。
当我想对用户更改动态创建的selectInputs
中的选定值时,会出现问题。通常,如果selectInput
是"静态",我会用observeEvent注册它:
selectInput
但是,我无法预先为未知数量的未指定observeEvent(input$select_inputId, { ... })
注册事件。是否有可能将某种事件处理程序传递给inputIds
或其他解决此问题的方法?
以下是动态创建UI的代码的基本部分:
selectInput
编辑:您可以在下面找到Shiny App的可重现示例。解决方案是存储用户在注释的observeEvent(input$rate_criterion_select, {
output$rate_criterions_ratios <- renderUI({
container <- tags$div()
for(i in seq(1, length(children_criterions))) {
container <- tagAppendChild(container, selectInput(
inputId = paste(input$rate_criterion_select, i)
label = ""
choices = rates
)
}
return(container)
})
})
变量中提供的值。例如:如果用户选择3个输入来填充并相应地选择&#34;一个&#34;,&#34;两个&#34;和&#34;三&#34;,choices
应该是一个向量choices
;如果用户选择2个输入来填充和选择&#34; 2&#34;,&#34; 2&#34; - c("One","Two","Three")
应为choices
。
server.R
c("Two","Two")
ui.R
library(shiny)
# choices <-
shinyServer(function(input, output) {
observeEvent(input$how_many, {
output$render_area <- renderUI({
container <- tags$div()
for(i in seq(1, as.numeric(input$how_many))) {
container <- tagAppendChild(container, selectInput(
inputId = paste("selection", i),
label = paste("Selection", i),
choices = c("One", "Two", "Three"),
selected = "One"
))
}
return(container)
})
})
})
答案 0 :(得分:1)
这不是你问题的答案,但我可以在你的代码中看到一些不应该做的奇怪事情。这是对您的代码的重写,我建议您将其作为起点:
ui <- fluidPage(
titlePanel("Example App"),
sidebarLayout(
sidebarPanel(
numericInput("how_many", "How many inputs do you want to fill?", 1, 1, 5)
),
mainPanel(
uiOutput("render_area")
)
)
)
server <-function(input, output) {
output$render_area <- renderUI({
lapply(seq(input$how_many), function(i) {
selectInput(
inputId = paste("selection", i),
label = paste("Selection", i),
choices = c("One", "Two", "Three")
)
})
})
}
shinyApp(ui,server)
numericInput()
lapplt()
创建并返回多个选择下拉列表,而不是使用for循环和tagAppendChild()
- 这是过度杀伤output$render_area
的观察者内部定义input$how_many
。 output$render_area
应该是顶级的。我建议阅读一些关于反应性的资源,因为这段代码意味着对反应性的误解(这是一个难题!)同样,这并没有回答你的问题,但我希望它能帮助你将来所有闪亮的代码。