如何在shinyglide中保存输入值?模态框值持久化问询
解决Shiny模态框输入值持久化问题
要实现关闭并重新打开模态框时保留修改后的mean、sd和n值,不需要依赖JavaScript,直接在R端用reactiveValues存储状态即可。以下是修改后的完整代码及关键说明:
修改后的完整代码
library(shiny) library(shinyglide) ui <- fixedPage( titlePanel("shinyglide modal example"), actionButton( inputId = "actionlatex1", label = "click" ), sidebarLayout( sidebarPanel( numericInput("mean", "Mean", value = 0), numericInput("sd", "Standard deviation", value = 1, min = 0), numericInput("n", "n", value = 100, min = 1), p( tags$a( href = "https://github.com/juba/shinyglide/blob/master/inst/examples/03_modal/app.R", "Source code on GitHub" ) ) ), mainPanel( plotOutput("plot") ) ) ) server <- function(input, output, session) { # 创建响应式变量存储持久化的mean和sd值 vals <- reactiveValues(mean = 0, sd = 1) modal_controls <- glideControls( list( prevButton(), firstButton( class = "btn btn-danger", `data-dismiss` = "modal", "No, thanks!" ) ), list( nextButton(), lastButton( class = "btn btn-success", `id` = "save", `data-dismiss` = "modal", "Done" ) ) ) observeEvent(input$actionlatex1, { showModal( modalDialog( title = "Startup assistant", easyClose = FALSE, footer = NULL, glide( custom_controls = modal_controls, screen( next_label = 'Yes, please ! <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>', p("Let's initialize some values, would you ?") ), screen( p("First, please select a mean value"), # 打开模态框时用持久化的值初始化输入框 numericInput("mean_modal", "Mean", value = vals$mean) ), screen( p("Next, please select a standard deviation value"), # 打开模态框时用持久化的值初始化输入框 numericInput("sd_modal", "Standard deviation", value = vals$sd, min = 0) ), screen( p("Thanks, we're all set !") ) ) ) ) }) output$plot <- renderPlot({ hist(rnorm(req(input$n), req(input$mean), req(input$sd)), main = "Such wow", xlab = "Wonderful x values", ylab = "Incredible frequencies") }) # 主界面输入更新时,同步到持久化变量 observe({ vals$mean <- input$mean vals$sd <- input$sd }) # 点击模态框的Done按钮时,同步模态框输入到持久化变量和主界面 observeEvent(input$save, { vals$mean <- input$mean_modal vals$sd <- input$sd_modal updateNumericInput(session, "mean", value = vals$mean) updateNumericInput(session, "sd", value = vals$sd) }) } shinyApp(ui, server)
关键修改说明
- 持久化状态存储:用
reactiveValues创建vals变量,专门保存mean和sd的当前值,作为主界面和模态框之间的状态桥梁。 - 模态框初始化:打开模态框时,直接用
vals中的值初始化模态框内的输入框,确保每次打开都是最新的修改值。 - 双向同步:
- 主界面的
mean/sd修改时,自动更新vals中的值; - 点击模态框的「Done」按钮时,将模态框内的修改值同步到
vals,再更新主界面的输入框。
- 主界面的
- n值的保留:主界面的
n输入框本身在Shiny会话内会自动保留输入值,无需额外处理,关闭模态框再打开时,n的当前值会维持不变。
内容的提问来源于stack exchange,提问作者neves
相关产品推荐
相关产品推荐

