R Shiny模块通信部署问题:多用户访问数据互相干扰如何解决
R Shiny golem框架多用户会话数据隔离解决方案
问题根源
该问题是Shiny的作用域机制导致的:
Shiny应用启动时,定义在服务端函数外的代码只会全局运行一次,对应变量所有访问用户共享;服务端函数内部的代码会在每个新用户发起访问时单独运行一次,生成的变量为当前用户会话独有,不会和其他用户互通。
你之前的reactiveValues如果定义在了app_server函数外部,就会成为全局共享变量,任意用户修改后所有用户都会同步看到更新。
解决步骤
- 调整响应式变量的定义位置,将
values = reactiveValues(data_imported=NULL)移动到app_server函数内部的最顶端,确保每个用户都有专属的数据集存储容器 - 保持原有模块通信逻辑不变,将会话内的
values变量传递给data、analysis两个子模块,模块内对values$data_imported的读写仅作用于当前用户的会话 - 排查并移除所有使用
<<-进行全局赋值的逻辑,所有会话内状态修改都通过当前会话的reactiveValues完成
代码示例
app_server.R参考写法:
app_server <- function(input, output, session) { # 会话独有的响应式变量,每个用户单独生成 values <- reactiveValues(data_imported = NULL) # 子模块调用,传入当前会话的values mod_data_server("data_module_id", values = values) mod_analysis_server("analysis_module_id", values = values) }
验证方法
本地启动应用后打开两个独立的浏览器窗口操作,在其中一个窗口修改导入的数据集,另一个窗口的数据不会发生同步变动,即说明隔离逻辑生效,重新部署即可正常支持多用户使用。
内容的提问来源于stack exchange,提问作者xuemaozhang
相关产品推荐
相关产品推荐

