Shiny - Обновление глобальной переменной и просмотр результата в текущем сеансе - PullRequest
0 голосов
/ 06 января 2020

Я работаю с глобальными переменными, которые обновляются после времени X. Эта проблема, с которой я сталкиваюсь, заключается в том, что она обновляет глобальную переменную, но текущий сеанс не обновляется соответствующим образом, однако при любом новом открытии сеанса используется обновленная глобальная переменная.

Вопрос: как заставить текущий сеанс использовать обновленную глобальную переменную? Я думал, что обернуть его в реактив будет работать, но это не так.

Код:

library(shiny)
library(shinydashboard)

####/GLOBAL/####
num <- 4

####/UI/####
header <- dashboardHeader()

sidebar <- dashboardSidebar()

body <- dashboardBody(
  verbatimTextOutput("test")
)

ui <- dashboardPage(header, sidebar, body)

####/SERVER/####
server <- function(input, output, session) {

  data <- reactive({num})
  output$test <- renderText({ data() })

  observe({
    invalidateLater(0.5*60*1000,session)

    num <<- sample(1:1000,1,replace=T)
  })

}

shinyApp(ui, server)

Если вы подождете более 30 секунд, а затем откроете новый сеанс, вы увидите, что номер изменился с 4, но в исходном сеансе все еще отображается 4. Они должны показывать тот же номер.

1 Ответ

0 голосов
/ 07 января 2020

Решено! Понял, что мне нужно обернуть его в reactiveValues против reactive. Я также сделал обновление значения кадром данных вместо одного числа, потому что это соответствует проблеме моей реальной панели.

library(shiny)
library(shinydashboard)

####/GLOBAL/####
dataset <- data.frame(ColA = c("dogs", "cats", "birds"), ColB = c(10, 2, 2), stringsAsFactors = FALSE)

####/UI/####
header <- dashboardHeader()

sidebar <- dashboardSidebar()

body <- dashboardBody(
  box(width = 3, tableOutput("test"))
)

ui <- dashboardPage(header, sidebar, body)

####/SERVER/####
server <- function(input, output, session) {

  values <- reactiveValues(n = dataset)

  data <- reactive({values$n})
  output$test <- renderTable({ data() })

  observe({
    invalidateLater(0.5*60*1000,session)

    new1 <- sample(1:10,1,replace=T)
    new2 <- sample(1:10,1,replace=T)
    new3 <- sample(1:10,1,replace=T)

    print(new1)
    print(new2)
    print(new3)

    dat <- data.frame(ColA = c("dogs", "cats", "birds"), ColB = c(new1, new2, new3), stringsAsFactors = FALSE)

    values$n <- dat
    dataset <<- dat

  })

}

shinyApp(ui, server)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...