gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:48:13 26 4
gpt4 key购买 nike

我使用 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 中是否有某种功能在每个新 session 开始时触发一个事件,例如 onsessionstart() 我可以直接使用它来增加全局变量 number.users ,以及一种通知其他 session 已打开新 session 的方法?或者有没有更简单的方法?
谢谢

最佳答案

根服务器函数为每个新 session 调用一次,并有效地用作“onSessionStart”回调。我认为你正在做的很好,除了 observe真的没有必要。

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

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)

顺便说一句, session 间通信的一个更复杂的例子,虽然现在可能有点老了,是 Shiny 聊天室应用程序 - http://shiny.rstudio.com/gallery/chat-room.html

关于r - 有多少用户连接到我的 Shiny 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47728208/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com