Использование responsetiveFileReader в приложении Shiny для обновления кадра данных при изменении базового CSV - PullRequest
0 голосов
/ 18 октября 2018

Я работаю над сложным (для меня) блестящим приложением ~ 2500 строк кода.Базовая структура выглядит следующим образом, хотя я не могу поделиться воспроизводимым примером, поскольку большая часть информации является конфиденциальной.

Прямо сейчас я использую df1 <- read.csv() и т. Д. Для чтения нескольких файлов CSV в качестве кадров данных.Я хочу использовать reactiveFileReader(), чтобы данные автоматически обновлялись при изменении исходного CSV-файла.Я думаю, что моя проблема может быть связана с тем, что я делаю это не в реактивном контексте, но для этого есть причина.Я использую фреймы данных df1 и т. Д. Для выполнения многих вычислений и создания новых переменных в приложении (разделы пользовательского интерфейса и сервера).

Также может быть важно отметить, что я выполняю импорт этих файлов в части пользовательского интерфейса приложения Shiny, поскольку мне нужно полагаться на уровни факторов этих фреймов, чтобы заполнить раскрывающийся список selectInput в моемUI.В этом может не быть необходимости.

Вот что я попробовал (хотя я довольно растерян):

reader <- reactiveFileReader(intervalMillis = 1000, filePath = 
"Data_Record.csv", readFunc = read.csv)

  data_record <- reactive({
    data_df <- reader()
    return(data_df)
  })

Я ожидал, что data_record будет кадром данных, содержащиминформация из CSV, но в итоге она становится «реактивным выражением».Когда я пытаюсь выполнить операции над data_record, такие как подмножество, я получаю ошибки, поскольку эта переменная не является фреймом данных.

Могу ли я обновить эти кадры данных после модификации базового CSV вне реактивного контекста?Даже запланированное обновление, как каждые 10 секунд или около того, будет работать также. Моей конечной целью являются кадры данных, которые обновляются при изменении CSV, но запланированные обновления также хороши.

Заранее благодарю за помощь и приношу свои извинения за невозможность предоставитьВоспроизводимый пример!Я постараюсь добавить больше информации по мере необходимости.

1 Ответ

0 голосов
/ 18 октября 2018

Таким образом, если вы хотите, чтобы данные были реактивными, они должны быть импортированы в раздел сервера приложения как «реактивные».В «блестящем» «реактивные» становятся функциями, поэтому, чтобы что-то с ними сделать, вы должны указать им их имя, а затем заключить в скобки внутри реактивной функции (реактивной, наблюдать, визуализировать и т. Д.).

Например, с кодом выше, reader становится реактивным кадром данных.Вы можете выполнить обычные манипуляции с данными на reader, если вы следуете приведенным выше правилам реактивов.

# server.R

reader <- reactiveFileReader(intervalMillis = 1000, filePath = 
"Data_Record.csv", readFunc = read.csv)

filtered_reader_df <- reactive({
  reader() %>% filter(x > 100)
})

Где filtered_reader_df становится реактивно фильтрованной версией реактивного файла CSV.Опять же, чтобы использовать filtered_reader_df в последующей реактивной функции, на нее нужно ссылаться как filtered_reader_df(), поскольку она сама является реактивной функцией.

Наконец, вы все равно можете использовать реактивный csv-файл для заполнения элементов пользовательского интерфейса с помощью updateSelectInput() функция внутри наблюдателя на сервере.Например:

ui <- fluidPage(
  selectInput("mySelectInput", "Select")
)

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

  reader <- reactiveFileReader(intervalMillis = 1000, filePath = 
                                 "Data_Record.csv", readFunc = read.csv)

  observe({
    select_input_choices <- unique(reader()$factor_column)

    updateSelectInput(session, inputId = "mySelectInput", choices = select_input_choices)
  })

}

Приведенный выше код будет обновлять выбор выбранного входа каждый раз, когда фрейм данных reader() изменяется на reactiveFileReader, где unique(reader()$factor_column) - реактивные уникальные значения столбца фактора.Вы хотите заполнить ввод.

...