Ответ 1
В этой статье описываются правила определения для блестящих приложений и способы определения глобальных данных с различным образом упакованным кодом. Ниже приведен мой пример глобальной переменной, содержащей данные, доступные для нескольких сеансов.
Запустите это приложение, затем откройте вторую вкладку/окно в своем браузере и укажите его в том же соединении. Вы можете нажать кнопку +1 за один сеанс, чтобы увеличить общий и локальный счет. В другой сессии вы не увидите никаких изменений до тех пор, пока что-то не начнет сверкать, чтобы повторно проверить общие данные, но нажав кнопку +1, вы обновите локальный счетчик, а также инициируете обновление значения общих максимальных данных. Вы можете щелкнуть по кнопке +1 несколько раз, пока у вас не будет новый макс, а затем вернитесь к первому окну, и вы увидите, что max также видна там, как только вы нажимаете кнопку +1 для запуска обновления. Это работает для нескольких окон.
Вам нужно что-то сделать, чтобы сеанс снова проверял данные для обновления. Я не слишком старался сделать это без побочных эффектов. Должен быть какой-то способ сделать "обновление" на основе любого триггера, который вы хотите. Вы можете даже использовать синхронизированный опрос для синхронизации данных, например этот пример с файлами.
Одно из предостережений в этом примере - это то, что я только попытался выполнить локальную реализацию сервера RStudio. Я не знаю, как это работает на реальном сервере. Если это не так, прокомментируйте это! Вероятно, это не будет работать на shinyapps.io или с любым видом облачной/балансировки нагрузки в целом, поскольку вы не можете гарантировать, что две сессии совместно используют экземпляр приложения на одной машине.
library(shiny)
globalMax <- 0
app <- shinyApp(
ui= pageWithSidebar(
headerPanel("Shared data demo"),
sidebarPanel(
actionButton("plusButton", "+1")
),
mainPanel(
verbatimTextOutput("sharedMax")
)
),
server= function(input,output){
observe({
if (input$plusButton > globalMax) {
globalMax <<- input$plusButton
}
})
output$sharedMax <- renderText({
paste0( "Shared max value: ", globalMax, "\n",
"Local value: ", input$plusButton)
})
}
)
runApp(app)