单个 运行 R Shiny 应用的多个会话之间的交互
Interactivity between multiple sessions of a single running R Shiny app
我想构建一个 R Shiny 应用程序,它能够将信息从一个 运行 实例传递到其他可能的 运行 实例。到目前为止,我没有发现任何可以帮助我解决这个问题的方法,我希望能够正确地完成它,而不是诉诸于全局变量 and/or 写入文件等(我在下面的示例中使用了全局变量,我知道是一种不好的做法;而且我怀疑写入文件也不是一个好的做法)。
例如,假设我的 App.R 运行 在服务器上并且 Tim、Jack John 打开它。如何让 Tim 见下文,当 Jack 和 John 也在同时使用该应用程序并按按钮如下例所示?
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
的激增而迅速增加。我必须跟踪所有导致脆弱、难以调试应用程序的状态变化。
我想构建一个 R Shiny 应用程序,它能够将信息从一个 运行 实例传递到其他可能的 运行 实例。到目前为止,我没有发现任何可以帮助我解决这个问题的方法,我希望能够正确地完成它,而不是诉诸于全局变量 and/or 写入文件等(我在下面的示例中使用了全局变量,我知道是一种不好的做法;而且我怀疑写入文件也不是一个好的做法)。
例如,假设我的 App.R 运行 在服务器上并且 Tim、Jack John 打开它。如何让 Tim 见下文,当 Jack 和 John 也在同时使用该应用程序并按按钮如下例所示?
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
的激增而迅速增加。我必须跟踪所有导致脆弱、难以调试应用程序的状态变化。