每次主输入改变时动态UI输入损失值

  • 本文关键字:UI 损失 动态 改变 shiny
  • 更新时间 :
  • 英文 :

library(shiny)
ui <- shiny::fluidPage(
shiny::titlePanel("Dynamic UI"),
shiny::sidebarLayout(
shiny::sidebarPanel(width = 2,
shiny::numericInput("num", "Number of input", value=1, min=1, max=7),
htmltools::hr(style = "border-top: 5px dashed skyblue"),
shiny::uiOutput("out")
),
shiny::mainPanel()
)
)
server <- function(input, output, session) {
output$out <- shiny::renderUI({
lapply(1:input$num, function(i) {
htmltools::div(
htmltools::tags$h4(paste0("Input group: ",i)),
shiny::numericInput(paste0("size", i),
label = "size",
value = 3, min = 1, max = 8
),
shiny::numericInput(paste0("inc", i),
label = "incidence",
value = 1, min = 1, max = 8
),
htmltools::hr(style = "border-top: 2px dashed skyblue")
)
})
})
}
shiny::shinyApp(ui, server)

我创建了一个应用程序的例子,根据其他输入动态创建多个数字输入(Number of input)这里)。现在当输入数当值发生变化时,所有动态创建的输入值都会被重置。我知道这是因为服务器端每次都创建这些输入输入数量的变化。但是,当用户改变输入的数量时,是否有办法使动态输入值保持不变?

?

使用react<-reactiveValues()保存值

使用observeEvent(input$num, {})将输入值保存为react

library(shiny)
ui <- shiny::fluidPage(
shiny::titlePanel("Dynamic UI"),
shiny::sidebarLayout(
shiny::sidebarPanel(width = 2,
shiny::numericInput("num", "Number of input", value=1, min=1, max=7),
htmltools::hr(style = "border-top: 5px dashed skyblue"),
shiny::uiOutput("out")
),
shiny::mainPanel()
)
)
server <- function(input, output, session) {

react <- reactiveValues(
S=list(),
I=list()
)

output$out <- shiny::renderUI({
lapply(1:input$num, function(i) {
input_size<- isolate(input[[paste0("size", i)]])
input_inc <- isolate(input[[paste0("inc",  i)]])

if (is.null(input_size)){
input_size<-3
}
if (is.null(input_inc)){
input_inc<-1
}      

htmltools::div(
htmltools::tags$h4(paste0("Input group: ",i)),
shiny::numericInput(paste0("size", i),
label = "size",
value = input_size , min = 1, max = 8
),
shiny::numericInput(paste0("inc", i),
label = "incidence",
value =  input_inc, min = 1, max = 8
),
htmltools::hr(style = "border-top: 2px dashed skyblue")
)
})

})
observeEvent(input$num, {    
i <- input$num
react$S[i]<- input[[paste0("size", i)]]
react$I[i]<- input[[paste0("inc", i)]]
},ignoreNULL = TRUE,    ignoreInit = TRUE
)

}
shiny::shinyApp(ui, server)

最新更新