【发布时间】:2019-03-31 06:59:33
【问题描述】:
我在选项卡中生成了一组动态 UI 表单。我使用动态观察事件来检查正在保存的表单。 请看下面的代码
library(shiny)
ui <- fluidPage(
actionButton("generate_tab","Generate Tabs"),
tabsetPanel(id="tabs",
uiOutput('tabsN')),
dataTableOutput("saved_tabs_output")
)
server <- function(input, output, session) {
rv<- reactiveValues(no_of_tabs =0)
#generating the UI dynamically
observeEvent(input$generate_tab,{
rv$no_of_tabs <- rv$no_of_tabs + 1
appendTab(inputId = "tabs",
tabPanel(title = paste0("Tab_",rv$no_of_tabs),
selectInput(paste0("Input",rv$no_of_tabs),paste0("Input",rv$no_of_tabs), choices = c('',LETTERS), selected = NULL),
actionButton(paste0("submit_input",rv$no_of_tabs),"submit input")
)
)})
# Reading the inputs upon clicking of Submit Input in each tab
#dynamic Observe Event needs to be set up dependent on number of Tabs (rv$no_of_tabs)
observeEvent(lapply(paste0("submit_input",1:rv$no_of_tabs), function(x){input[[x]]
}
),{
rv$inputs <-sapply(paste0("Input",1:rv$no_of_tabs),
function(x)input[[x]])
},ignoreInit = TRUE )
output$saved_tabs_output <- renderDataTable({
as.data.frame(rv$inputs)
})
}
shinyApp(ui, server)
因为在一个 observeEvent lapply 公式中检查了多次提交按钮点击,所以它也接受来自未提交表单的输入。这是一个例子
第 1 步:点击 Generate tabs 4 次以生成 Tab1、Tab2、Tab3、Tab 4。单击 Tab 1
期望的输出是只更新 Input4 而不是 input1,但是在这种情况下,B 和 D 都被保存。关于如何解决这个问题的任何指示?
【问题讨论】: