【问题标题】:Interactivity between multiple sessions of a single running R Shiny app单个正在运行的 R Shiny 应用程序的多个会话之间的交互性
【发布时间】:2017-05-10 01:22:49
【问题描述】:

我想构建一个 R Shiny 应用程序,它能够将信息从一个正在运行的实例传递到其他可能的运行实例。到目前为止,我没有发现任何可以帮助我解决这个问题的方法,我希望能做对,而不是求助于全局变量和/或写入文件等(我在下面的示例中使用了全局变量,我知道这是一个不好的做法;而且我怀疑写入文件也不是一个好的做法)。

例如,假设我的 App.R 在服务器上运行,TimJackJohn 将其打开。当 JackJohn 也同时使用应用程序并按下下例所示的按钮时,如何让 Tim 看到下面的内容?

App.R:

library(shiny)

# Somehow interactively visible variable? (I know global variables are bad, I wouldn't want to use such)
txt <<- ""

shinyApp(
    ui = fluidPage(
        textInput("name", "User name", value="USERNAME"),
        actionButton("button", "Button"),
        htmlOutput("text")
    ),
    server = function(input, output, session){
        a <- eventReactive(input$button, {
            txt <<- paste(txt, "Button pressed by", input$name, "at", Sys.time(), "<br>")
            txt

        })
        output$text <- reactive({
            HTML(a())
        })
    }
)

在各自的用户按下多个按钮后所需的输出示例,这些用户都在其浏览器中运行了一个应用程序实例(都选择了唯一的 input$name,但显然唯一的会话 id 会更好):

任何见解将不胜感激,谢谢!

【问题讨论】:

  • 我不认为你可以让会话与每个孩子交互,但我已经构建了一些将事件写入数据库的应用程序。应用程序中的某些操作将调用查询并拉取其他并发用户所做的任何新更改。
  • 这似乎是一个可能的解决方案,尽管我希望有一些直接交互的方式。我想我可能还必须构建一些基于 SQL 的解决方案来传递信息,这绝对是一种方法,即使超出了 R Shiny。需要考虑一下,谢谢!

标签: r interactive shiny shiny-reactivity


【解决方案1】:

我已经在一个闪亮的服务器实例上测试了您的代码,它按预期工作:即我得到了与您要求的类似的打印输出。

我有点困惑:你到底在找什么?

无论如何,作为一般性评论,我不同意使用 &lt;&lt;- 是错误的或 global variables(通常或在闪亮的应用程序中)不好

它们有自己的位置,一个典型的用例是跨会话/用户传递状态。

另一种方法是使用shiny reactiveValues,如:

 values <- reactiveValues()
 values$lognames <- ''
 ...
 ui <- (...)

 server <- function(input, output, session){

 a <- eventReactive(input$button, {
 values$lognames <- paste(values$lognames, "Button pressed by", input$name, "at", Sys.time(), "<br>")
 values$lognames
 })
...
 }

但作为一般注意事项,这种类型的设计虽然可能,但最终可能会为应用带来有状态,从而迅速提高其复杂性,并与reactive 的简单性背道而驰范式。

我的强烈建议是,在这条道路上的每一步之前都要仔细考虑。我有过实施闪亮应用程序的经验,这些应用程序的复杂性随着这些states 的激增而迅速升级。我必须跟踪所有导致应用程序脆弱、难以调试的状态变化。

【讨论】:

  • 您好,谢谢 - 代码有效,但问题是,这些消息中的每一个都应该由 R Shiny App 的单独运行实体发送。假设“Tim”将住在另一个国家,他的 input$name 如上所述,他正在运行他的应用程序。然后名为“John”的其他人同时使用该应用程序(例如来自另一个国家/地区),我希望能够在这些单独的会话之间发送信息;例如,假设我想通过传递短信来为使用 R Shiny 的多人构建一个实时聊天室。
  • Jeff Allen,RStudio 员工和闪亮的服务器开发人员在这里有一个聊天室示例:github.com/trestletech/ShinyChat/blob/master/server.R。这是我学会使用reactiveValues的地方!
  • 谢谢,这听起来很有希望! :) 必须检查一下
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 2012-05-04
  • 2011-12-21
相关资源
最近更新 更多