下面的应用程序包含一个actionButton
,Add
,在单击时会插入两个输入。
第一个输入是带有选择A
和B
的selectInput。如果用户选择textInput
,则第二个输入是A
;如果用户选择numericInput
,则第二个输入是B
。我不确定如何捕获此依赖关系。
我尝试将事件处理程序(下面的代码中的第二个observeEvent
)附加到每个selectInput
上,该事件处理程序监听该selectInput
的值,并使用{{ 1}}。但是,这不起作用。我还对在observeEvent中使用渲染函数保持警惕,因为我已阅读到在观察者内部使用渲染不是一种好习惯(不确定原因)。它看起来也很凌乱。
应用程序:
renderUI
插入的第一个UI块按预期工作-渲染两个输入。但是,在随后的块(下面的屏幕快照中的块2和3)中,仅呈现selectInput。
这是屏幕截图:
答案 0 :(得分:1)
以下是有效代码。主要问题是您的ctn
无功值已初始化为NULL
,因为NULL + 1 = numeric(0)
和numeric(0) + 1 = numeric(0)
。
library(shiny)
ui <- fluidPage(
actionButton('add', 'Add'),
div(id = 'placeholder')
)
server <- function(input, output, session) {
ctn <- reactiveVal(0)
Id <- reactive({
function(id){
paste0(id, ctn())
}
})
observeEvent(input$add, {
ctn(ctn() + 1)
insertUI(
selector = '#placeholder',
ui = div(
id = Id()('div'),
selectInput(Id()('letter'), 'Letter:', LETTERS[1:2]),
uiOutput(Id()('input'))
)
)
})
observeEvent(ctn(), {
id <- Id()('input')
selection <- Id()('letter')
output[[id]] <- renderUI({
req(input[[Id()('letter')]])
switch(
input[[selection]],
'A' = textInput(Id()('text'), 'ENTER TEXT', ''),
'B' = numericInput(Id()('numeric'), 'ENTER NUMBER', '')
)
})
}, ignoreInit = TRUE)
}