【问题标题】:Saving state of Shiny app to be restored later保存 Shiny 应用程序的状态以便稍后恢复
【发布时间】:2015-12-31 13:12:57
【问题描述】:

我有一个闪亮的应用程序,其中包含许多选项卡和每个选项卡上的许多小部件。它是一个数据驱动的应用程序,因此数据与每个选项卡相关联。

可以使用image.save() 保存应用程序并创建一个.RData 文件供以后使用。

我遇到的问题是如何为 widgets 恢复状态?

如果用户在列表框中选中了复选框、选中的单选按钮和指定的基线值,我可以在load() 步骤中设置它们吗?

已经找到了诸如shinyURLshinystore 之类的库,但是有没有直接的方法可以将环境设置回write.image 完成时的状态?

我什至不知道从哪里开始,所以我无法发布代码。

编辑:这是来自Shiny Google Group 的交叉帖子,其中建议了其他解决方案

【问题讨论】:

  • Here 您可以使用闪亮的内置功能创建书签找到相关答案。

标签: r shiny shinystore


【解决方案1】:

如果闪亮的 UI 涉及日期,上述示例可能不起作用。这是日期处理的一个小改动。

library(shiny)

shinyApp(
  ui = fluidPage(
    dateInput("date", "date", "2012-01-01"),
    selectInput("select", "select", 1:5),
    uiOutput("ui"),
    actionButton("save", "Save"),
    actionButton("load", "Load")
  ),

  server = function(input, output, session) {

    output$ui <- renderUI({
      tagList(
        numericInput("num", "num", 7),
        checkboxGroupInput("chk", "chk", 1:5, c(2,4))
      )
    })

    observeEvent(input$save, {
      values <<- lapply(reactiveValuesToList(input), unclass)
    })

    observeEvent(input$load, {
      if (exists("values")) {
        lapply(names(values),
               function(x) session$sendInputMessage(x, list(value = values[[x]]))
        )
        temp=as.character(as.Date(values$date, origin = "1970-01-01"))
        updateDateInput(session, inputId="date", label ="date", value = temp)
      }
    })
  }
)

【讨论】:

    【解决方案2】:

    现在可以通过书签来保存闪亮应用的状态。您必须将书签按钮放在您的应用程序上以及 enableBookmarking 上。

    【讨论】:

      【解决方案3】:

      这有点hacky,但它有效。它使用了一个“内部”函数 (session$sendInputMessage),该函数并不意味着显式调用,因此不能保证这将始终有效。

      您想保存input 对象的所有值。我正在使用reactiveValuesToList(input) 获取所有小部件(请注意,这也会保存按钮的状态,这并不完全有意义)。另一种方法是准确枚举要保存的小部件,但该解决方案不太通用,每次添加/删除输入时都必须更新它。在下面的代码中,我只是将值保存到名为values 的列表中,您可以根据需要将其保存到文件中(RDS/文本文件/其他)。然后加载按钮查看该列表并根据列表中的值更新每个输入。

      this thread也有类似的想法

      library(shiny)
      
      shinyApp(
        ui = fluidPage(
          textInput("text", "text", ""),
          selectInput("select", "select", 1:5),
          uiOutput("ui"),
          actionButton("save", "Save"),
          actionButton("load", "Load")
        ),
      
        server = function(input, output, session) {
      
          output$ui <- renderUI({
            tagList(
              numericInput("num", "num", 7),
              checkboxGroupInput("chk", "chk", 1:5, c(2,4))
            )
          })
      
          observeEvent(input$save, {
            values <<- lapply(reactiveValuesToList(input), unclass)
          })
      
          observeEvent(input$load, {
            if (exists("values")) {
             lapply(names(values),
                    function(x) session$sendInputMessage(x, list(value = values[[x]]))
                    )
            }
          })
        }
      )
      

      【讨论】:

      • 我在这里的答案和建议的线程方面取得了巨大的成功。谢谢大家的支持。我确实有一个后续问题。我同时使用 rhandsontable 和 renderUI。对于 rhandsontable,我可以使用这里的技术来保存和更新它。我需要确保小部件已激活,以便在保存应用程序时触发回调。有没有办法在代码中强制这样做? renderUI 仍然是一个谜,任何建议都会很棒。
      猜你喜欢
      • 2013-02-24
      • 2013-05-16
      • 2021-08-03
      • 2010-10-31
      • 1970-01-01
      • 1970-01-01
      • 2012-09-17
      • 2012-12-03
      • 1970-01-01
      相关资源
      最近更新 更多