在Shiny会话结束时保存用户输入?

时间:2018-05-24 14:41:36

标签: r input shiny save session-state

我正在尝试制作Shiny App,它允许用户保存输入并稍后加载它们。

最简单的方法是制作保存按钮,这样可以节省输入。这是演示的基本应用程序:

server.R

ui <- fluidPage(
sidebarLayout(
sidebarPanel(
sliderInput("integer", "Integer:",
            min = 0, max = 1000,
            value = 500)
),

mainPanel(tableOutput("values"),
actionButton('save_inputs', 'Save inputs')
)

))

server <- function(input, output, session) {
  sliderValues <- reactive({
    value = input$integer
  })

  output$values <- renderTable({
    sliderValues()
  })

  observeEvent(input$save_inputs,{
    saveRDS( input$integer , file = 'integer.RDS')
  })
}

shinyApp(ui = ui, server = server)

但是,我想自动保存,例如我希望在会话结束时保存输入。 onSessionEnded()应该回答这个问题,但它无法达到输入值并保存它们。

 session$onSessionEnded( function() {
   saveRDS( input$integer, file = 'integer.RDS')
 })

返回错误:警告:

  

.getReactiveEnvironment()中的错误$ currentContext:操作不是   允许没有活跃的反应上下文。 (你试图做点什么   只能在反应性表达或观察者内部完成。)

有什么办法可以解决吗?

2 个答案:

答案 0 :(得分:1)

使用另一个观察事件函数并观察isClosed()的值我们可以  做这项工作

observeEvent(session$isClosed()==T,{
saveRDS( input$integer, file = 'integer.RDS')
})

observeEvent()以及reactive()都被认为是&#34;反应性的&#34;环境意味着他们正在观察整个会话中的值,而不仅仅是在启动时。如果你把一个需要在被动环境之外被动的函数发光,那么你会发送错误信息,告诉你除非我们将它包装在一个被动函数中,否则永远不会调用该函数。

对于组合良好的问题,也是+1。

答案 1 :(得分:0)

使用 isolate 似乎可以解决问题。

 session$onSessionEnded(function() {
   isolate(saveRDS( input$integer, file = 'integer.RDS'))
 })