【发布时间】:2019-10-17 00:02:34
【问题描述】:
下面的应用程序包含一个actionButton、Add,单击时会插入两个输入。
第一个输入是一个 selectInput,其中有 A 和 B 选项。如果用户选择A,则第二个输入是textInput;如果用户选择B,则输入numericInput。我不确定如何捕获这种依赖关系。
我尝试将一个事件处理程序(下面代码中的第二个observeEvent)附加到每个selectInput,它侦听该selectInput 的值并使用renderUI 相应地呈现第二个输入。但这不起作用。我也对在 observeEvent 中使用渲染函数持谨慎态度,因为我已经读过在观察者中使用渲染不是好的做法(不完全确定为什么)。看起来也很乱。
应用程序:
library(shiny)
ui <- fluidPage(
actionButton('add', 'Add'),
div(id = 'placeholder')
)
server <- function(input, output, session) {
rv = reactiveValues(ctn = NULL)
observeEvent(input$add, {
rv$ctn = rv$ctn + 1
Id = function(id, ctn = rv$ctn) paste0(id, ctn)
insertUI(
selector = '#placeholder',
ui = div(
id = Id('div'),
selectInput(Id('letter'), 'Letter:', LETTERS[1:2]),
uiOutput(Id('input'))
)
)
observeEvent(Id('letter'), {
output[[Id('input')]] <- renderUI({
switch(
input[[Id('letter')]],
'A' = textInput(Id('text'), '', ''),
'B' = numericInput(Id('numeric'), '', '')
)
})
})
})
}
shinyApp(ui = ui, server = server)
插入的第一个 UI 块按预期工作 - 两个输入都被渲染。但是,在随后的块中(下面屏幕截图中的块 2 和 3)仅呈现 selectInput。
这是截图:
【问题讨论】: