我有一个简单的闪亮应用程序,可以记录用户按下某个操作按钮(actionButton()
)的次数,这个总数会和其他信息沿着报告给用户。
现在我知道Shiny R为每个应用创建一个R会话,所以如果多个用户同时访问同一个应用,他们都在使用同一个R会话。因此,报告的用户X的动作按钮按压次数最终是在当前R会话期间已经访问应用的所有用户的动作按钮按压的总和。
我想让用户分开,在某种意义上,在一个R会话中创建应用程序的虚拟示例。
我知道当函数shinyserver()
使用session
参数运行时,会创建一个会话对象,并且有关客户端计算机的信息存储在session$clientdata
中。
是否有一些已知的方法来利用此对象的内容,以便设置和管理跟踪在任何给定时间访问应用程序的各种用户的状态的文件?
2条答案
按热度按时间50few1ms1#
我想你搞错了。默认情况下,Shiny为每个Shiny应用创建一个 * 进程 *,但可以促进无限数量的 * 会话 *(即“用户连接”)。
查看本教程的本章,了解有关范围的更多信息:https://shiny.posit.co/r/articles/improve/scoping/
基本上,在
shinyServer()
表达式中定义的任何内容都将是单个用户会话的私有内容。任何放在shinySever
之外的变量都将在所有用户之间全局共享。所以你可以只保留你的变量(例如点击计数器),如果您不希望它们在会话之间共享。mzsu5hc02#
呃,虽然原则上shinyserver应该用单独的对象创建单独的用户会话,但这不是我的经验。我不知道为什么,也许是因为我所有的用户都在同一个VPN上?我实际上让多个用户从多个位置登录到应用程序来测试这一点,是的,他们最终不适当地共享数据/对象。我得到的一个巧妙的方法是使用会话对象,正如你上面提到的所有变量。例如:
session$userData$sometext <- gsub("\\s", "", input$sometext)
session$userData$ab <- paste0(session$userData$a, session$userData$b, collapse = "")
话虽如此,我遇到的问题是,这个应用程序允许用户编辑和更新表格,所以有一些复杂的React逻辑;它可能不是所有应用程序的问题。