我发现以下模式对我有用:在 server 之外创建一个 reactiveVal 对象,然后在应用程序中访问/更新它。在这里,我编写了一个包装器,用于在聊天中获取和附加按摩。 (代码如下)
但是,我认为这种模式只有在所有用户共享同一个 R 会话时才有效,并且如果当前 R 会话结束(所有用户断开连接),数据将会丢失。因此,您可能需要查看this article 以了解持久存储方法。另外,请查看reactiveFileReader 的文档以获取更便捷的文件访问方式。
library(shiny)
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
textInput("msg", "Message", placeholder = "type a message in the chat"),
actionButton("submit", "submit")
),
mainPanel(
verbatimTextOutput("text")
)
)
)
createChat <- function(initVal) {
chat_text <- reactiveVal(initVal)
list(
get = function(){ chat_text() },
append = function(val) {
chat_text(paste0(isolate(chat_text()), "\n", val))
}
)
}
myChat <- createChat("## This is a chat ##\n")
server <- function(input, output) {
observeEvent(input$submit, {
myChat$append(input$msg)
})
output$text <- renderText(myChat$get())
}
shinyApp(ui = ui, server = server)