有多少用户连接到我出色的应用程序? [英] How many users are connected to my Shiny application?

查看:46
本文介绍了有多少用户连接到我出色的应用程序?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用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,以及通知其他会话新会话已打开的方法?或者有没有更简单的办法?

谢谢

推荐答案

根服务器函数每个新会话调用一次,有效充当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

这篇关于有多少用户连接到我出色的应用程序?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆