保存Shiny app的状态以便稍后恢复

时间:2015-10-03 11:48:53

标签: r shiny

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

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

我遇到的问题如何才能恢复小部件的状态?

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

已经找到了shinyURLshinystore这样的库,但有没有直接的方法将环境设置回write.image完成时?

我不确定从哪里开始,所以我无法发布代码。

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

3 个答案:

答案 0 :(得分: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]]))
              )
      }
    })
  }
)

答案 1 :(得分:0)

现在可以通过添加书签来保存Shinyapp的状态。您必须在应用程序上加上bookmarkButton,还要在enableBookmarking上放

答案 2 :(得分:0)

如果闪亮的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)
      }
    })
  }
)