【问题标题】:How many users are connected to my Shiny application?有多少用户连接到我的 Shiny 应用程序?
【发布时间】:2017-12-09 11:44:33
【问题描述】:

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

我想出了第一段似乎可以工作的代码:

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() 我可以直接使用它来增加全局变量 @987654325 @,以及通知其他会话新会话已打开的方法?或者有没有更简单的方法?

谢谢

【问题讨论】:

    标签: r session shiny global-variables


    【解决方案1】:

    根服务器函数为每个新会话调用一次,并有效地用作“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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-07
      • 2012-05-04
      • 1970-01-01
      • 2017-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多