2016-12-24 67 views
3

我想构建一个R Shiny应用程序,它能够将信息从一个运行实例传递到其他可能的运行实例。到目前为止,我还没有找到任何可以帮助我的东西,我希望能够做到这一点,而不是诉诸全局变量和/或写入文件等(我在下面的示例中使用了全局变量,我知道它是一个不好的做法;我怀疑写文件也不是一个好习惯)。单个运行的多个会话之间的交互R Shiny应用程序

因此,举例来说,假设我有一台服务器和杰克约翰有它开上运行我的App.R。如何使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()) 
     }) 
    } 
) 

例所需的输出(全部具有独特的输入$名称选择,但显然是独一无二的会话ID会更好):

Example user case

任何有识之士将不胜感激,谢谢!

+1

我不认为你可以让会话与其他人进行交互,但我已经构建了一些将事件写入数据库的应用程序。应用程序中的某些操作将调回查询并提取其他并发用户所做的任何新更改。 – Benjamin

+0

这似乎是一个可能的解决方案,虽然我希望有一些直接交互的方式。我想我可能不得不建立一些基于SQL的解决方案以传递信息,这绝对是即使超越R Shiny也能做到的一种方式。需要考虑一下,谢谢! –

回答

3

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

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

不管怎样,作为一个一般性意见我会不同意,使用<<-是错误的,或者global variables(一般或有光泽的应用程序)是

他们有自己的位置,实际上典型的用例是跨会话/用户传递状态。

另一种方法是使用shinyreactiveValues为:

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的泛滥而迅速升级。我不得不跟踪所有状态变化导致脆弱,难以调试的应用程序。

+0

你好,谢谢 - 代码有效,但问题是,这些消息中的每一条都应该由R Shiny App的单独运行实体发送。假设“蒂姆”会住在另一个国家,他的输入$名称如上所示,他正在运行他的应用程序。然后名为“John”的其他人同时使用该应用程序(例如来自另一个国家),我希望能够在这些单独的会话之间发送信息;举个例子,比方说,我想通过传递他们的短信来为使用R Shiny的多人建立一个实时聊天室。 –

+1

杰夫艾伦,RStudio员工和闪亮的服务器开发人员在这里有一个聊天室的例子:https://github.com/trestletech/ShinyChat/blob/master/server.R。这是我学会使用'reactiveValues'的地方! – Enzo

+0

谢谢,这听起来很有希望! :)要检查出来 –

相关问题