Tee*_*ala 4 interactive r shiny shiny-reactivity
我想构建一个R Shiny应用程序,该应用程序能够将信息从一个正在运行的实例传递到其他可能的正在运行的实例。到目前为止,我发现没有任何东西可以帮助我解决这个问题,我希望能做到这一点,而不是求助于全局变量和/或写入文件等(我在下面的示例中使用了全局变量,我知道这是一个不好的做法;而且我怀疑写入文件也不是一种好的做法)。
例如,假设我的App.R在服务器上运行,而Tim,Jack和John则将其打开。当Jack和John同时使用该应用程序并按以下示例所示按按钮时,如何使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())
})
}
)
Run Code Online (Sandbox Code Playgroud)
在各自的用户都在其浏览器中运行了应用程序实例的各个用户按下多个按钮之后的期望输出示例(所有人都选择了唯一的input $ 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
})
...
}
Run Code Online (Sandbox Code Playgroud)
但请注意,这种设计虽然可能,但最终可能会为应用程序带来状态感,从而迅速提高其复杂性并与reactive范式的简单性背道而驰。
我的强烈建议是在这条道路上的每一步之前都要认真思考。我拥有实施闪亮的应用程序的经验,这些应用程序的复杂性随着这些应用程序的激增而迅速升级states。我必须跟踪导致易碎,难以调试的应用程序的所有状态更改。