我在使用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
并不是真的。
要以更具反应性的方式共享会话之间的全局状态,您可以在全局范围(在反应性上下文之外)中初始化reactiveVal
或reactiveValues
对象,然后在每个会话中对其进行反应性依赖性。这些反应性值的任何更新都会立即传播到所有其他会话。
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