Почему мои реактивные значения не инициализируются в функции сервера, уникальной для каждого сеанса?

Я развертываю свое приложение на shinyapps и замечаю странное поведение, когда у меня открыто несколько окон. Я обработал таблицу данных, и когда я обновляю фильтры в окне, моя таблица обновляется только в последнем открывшемся окне.

Я переместил свои реактивные значения для загрузки в функцию сервера после прочтения обзорной документации.

app.R

source("helpers/load_data.R")

server <- function(input, output, session) {

source("helpers/load_session_data.R")

output$risk_table <- renderDataTable({
DT::datatable(riskData$data
              rownames = FALSE)
})

observeEvent(input$get_filtered_data, {
    # UpdateTable function takes my table_csv and filters by the date, and updates the riskData reactive value
    UpdateTable(table, input$date)
}

UpdateTable <- function(table, date) {
#... filter stuff
riskData$data <- filtered_table
}
}

load_session_data.R

#table is a data.frame loaded globally outside of the ui and server functions.
riskData <- reactiveValues(data = table_csv) 

Я думал, что загрузка моих реактивных значений в функции сервера означает, что у каждого сеанса будут свои реактивные значения? Я хочу иметь возможность фильтровать таблицу независимо друг от друга в разных сессиях.

1 ответ

Решение

Вам нужно сделать две вещи

1 комплект local=T во время исходного звонка

source("helpers/load_data.R", local=T)
source("helpers/load_session_data.R", local=T)

"Если вы используете значение по умолчанию local = FALSE, тогда файл будет получен из глобальной среды".

Источник

2) Поместите исходные вызовы под функцию сервера, в противном случае даже при включении local=T вызов будет разделен между сеансами

server <- function(input, output, session) {
source("helpers/load_data.R", local=T)
source("helpers/load_session_data.R", local=
...
}

Действительно хороший пример в блестящей документации.. (Код можно найти здесь)

# Objects in this file are shared across all sessions in the same R
# process
source('all_sessions.R', local = TRUE)

server <- function(input, output, session) {
  # Objects in this file are defined in each session
  source('each_session.R', local = TRUE)

  output$text <- renderText({
    # Objects in this file are defined each time this function is called
    source('each_call.R', local = TRUE)

    # ...
  })
}
Другие вопросы по тегам