单个 运行 R Shiny 应用的多个会话之间的交互

Interactivity between multiple sessions of a single running R Shiny app

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

例如,假设我的 App.R 运行 在服务器上并且 TimJack John 打开它。如何让 Tim 见下文,当 JackJohn 也在同时使用该应用程序并按按钮如下例所示?

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())
        })
    }
)

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

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

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

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

无论如何,作为一般性评论,我不同意使用 <<- 是错误的,或者 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 的激增而迅速增加。我必须跟踪所有导致脆弱、难以调试应用程序的状态变化。