在具有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)
答案 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)