有多少用户连接到我的Shiny应用程序?

时间:2017-12-09 11:44:34

标签: r session shiny global-variables

我使用shinydashboard处理Shiny应用程序并在应用程序中的某个位置我想显示一条通知,告诉用户有多少其他用户同时连接到该应用程序。

我想出了work的第一段代码:

library(shiny)
ui=fluidPage(uiOutput("text"))
number.users <- 0 # global variable
server= function(input, output, session){
     already.counted = FALSE
     autoInvalidate = reactiveTimer(2000)
     observe({
          if (!already.counted) {
               already.counted <- TRUE
               number.users <<- number.users + 1
          }
     })
     output$text = renderUI({
          autoInvalidate()
          h1(paste0("There are ", number.users, " user(s) connected to this app"))
          })
     onSessionEnded(function(){number.users <<- number.users - 1})
}

然而,它不是很“干净”,我担心我对observe的呼叫和每2秒无效的呼叫会给我(已经很重)的应用程序增加一些无用的计算时间。我想知道shiny中是否有某种函数在每个新会话开始时触发一个事件,比如 onsessionstart()我可以直接使用它来递增全局变量number.users,以及通知其他会话已打开新会话的方法?或者有更简单的方法吗?

由于

1 个答案:

答案 0 :(得分:2)

为每个新会话调用一次根服务器功能,并有效地充当&#34; onSessionStart&#34;打回来。我认为你做的很好,除了observe并非真的有必要。

要以更具反应性的方式在会话之间共享全局状态,您可以在全局范围内(在响应式上下文之外)初始化reactiveValreactiveValues对象,然后对其采取被动依赖关系在每个会话中。对这些被动值的任何更新都将立即传播到所有其他会话。

library(shiny)

users = reactiveValues(count = 0)

ui = fluidPage(uiOutput("text"))

server = function(input, output, session) {
  onSessionStart = isolate({
    users$count = users$count + 1
  })

  onSessionEnded(function() {
    isolate({
      users$count = users$count - 1
    })
  })

  output$text = renderUI({
    h1(paste0("There are ", users$count, " user(s) connected to this app"))
  })
}

shinyApp(ui, server)
Btw,一个更复杂的会话间通信示例,虽然现在可能有点老了,但是Shiny聊天室应用程序 - http://shiny.rstudio.com/gallery/chat-room.html