You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 05:14:57