在会话退出时存储reactiveVal

时间:2018-03-06 04:04:58

标签: r shiny

在具有reactiveVal的服务器功能中,如何在会话断开连接时将值写入本地存储?

对于非反应性val,比如x,我会这样做:

session$onSessionEnded(function() {
    save(x, file = filename)
    stopApp()
})

但如果我之前有x <- reactiveVal(x),那么我的猜测是

session$onSessionEnded(function() {
    save(x(), file = filename)
    stopApp()
})

失败。显然,&#34; [我]试图做一些只能在反应性表达或观察者内部完成的事情。&#34;

使用mwe更新

library(shiny)

server <- function(input, output,session) {

    msg1 <- 'Works fine.'
    msg2 <- reactiveVal('No worky.')

    session$onSessionEnded(function() {
        save(msg1, file = 'msg1.RData')
        msg <- msg2()
        save(msg, file = 'msg2.RData')
    })
}

shinyApp(ui = fluidPage(), server = server)

1 个答案:

答案 0 :(得分:2)

如果活动进程中只有一个用户,这是一个可以正常工作的示例。我们使用reactiveVal运算符随时更改<<-到全局环境。当会话结束时,我们将该全局变量写入文件。

如果多个用户同时处于同一个Shiny进程中,这也是出错的原因;他们分享全球环境。因此,如果序列是:用户1修改,用户2修改,用户1退出,用户2退出,通过此实现,我们将用户2的reactiveVal写入磁盘两次。

希望这有帮助!

library(shiny)

server <- function(input, output,session) {

  msg1 <- 'Works fine.'
  msg2 <- reactiveVal('No worky.')

  observeEvent(msg2(),
               {
                msg <<- msg2() # Write to global environment 
               })

  session$onSessionEnded(function() {
    # Write from global environment to file
    save(msg, file = 'msg.RData')
  })
}

shinyApp(ui = fluidPage(), server = server)