R-将多少用户连接到我的闪亮应用程序



我在使用shinydashboard的闪亮应用程序上工作,并且在应用程序中的某个地方,我想显示一条通知,告诉用户同时连接了多少其他用户。

我想出了似乎有效的第一件代码:

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,并且通知其他会议的方法,即已经开了一个新会议?还是有更简单的方法可以使用?

谢谢

每个新会话都调用一个root Server函数,并有效用作" OnsessionStart"回调。我认为您在做什么很好,除了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)

顺便说一句,虽然现在可能有点老,但会有一些更复杂的示例,是闪亮的聊天室应用-http://shiny.rstudio.com/gallery/chat-room.html

相关内容

  • 没有找到相关文章