#r #mongodb #shinydashboard
Вопрос:
У меня есть блестящее приложение, которое включает в себя несколько выпадающих полей выбора, значения которых заполняются при чтении файла RDS. Приложение также включает функцию ввода файлов для загрузки новых данных. Как я могу изменить значения в раскрывающихся окнах, чтобы отразить новые данные? В настоящее время я вижу, что данные загружены, но старые данные остаются в раскрывающемся списке.
Данные, которые должны быть загружены, сохраняются в файл с помощью
saveRDS( data.frame(names=c("Jill","Jane","Megan")),"myDataFrame.rds")
В моем файле app.R я сначала определяю значение данных по умолчанию:
myDataFrame lt;- data.frame(names=c("Tom","Dick","Harry"))
Содержание моего app.R
заключается в следующем:
library(shiny) ui lt;- shinyUI( fluidPage( fileInput('file1', 'Choose file to upload',accept = ".rds"), selectInput("myNames","Names",myDataFrame$names), tableOutput('contents') ) ) server lt;- shinyServer(function(input, output) { output$contents lt;- renderTable({ inFile lt;- input$file1 if (is.null(inFile)) { return(myDataFrame) } readRDS(inFile$datapath) }) })
Первоначальный вид приложения соответствует ожиданиям: как раскрывающийся список, так и таблица содержат имена по умолчанию. При загрузке моего файла RDS, содержащего новый фрейм данных, таблица меняется (что я и искал), но выпадающие значения не меняются. Как я могу сделать так, чтобы произошло последнее?
Ответ №1:
Я добавил реактивный объект myData
, который вы должны использовать для таблицы contents
, но, что более важно, для обновления вариантов selectInput
(проверка observe
и updateSelectInput
часть).
library(shiny) ui lt;- shinyUI( fluidPage( fileInput("file1", "Choose file to upload", accept = ".rds"), selectInput("myNames","Names", ""), tableOutput("contents") ) ) server lt;- function(input, output, session) { myData lt;- reactive({ inFile lt;- input$file1 if (is.null(inFile)) { d lt;- myDataFrame } else { d lt;- readRDS(inFile$datapath) } d }) output$contents lt;- renderTable({ myData() }) observe({ updateSelectInput(session, "myNames", label = "myNames", choices = myData()$names, selected = myData()$names[1]) }) } shinyApp(ui, server)
Комментарии:
1. Нет(пока нет). Выпадающий список теперь заполнен цифрами 1, 2 и 3 — как до, так и после загрузки файла.
2. @janverkade Вы используете точный код и то же
myDataFrame
самое ? Вы изменили данные.кадры? Я предполагаю, что номера строк имеют к этому какое-то отношение.3. Странно, потому что я этого не понимаю (моя блестящая версия
shiny_1.0.3
).4. Обновление с 0.14 до 1.0.3 исправило все в порядке 😉 Большое спасибо!
Ответ №2:
чтобы опровергнуть ответ @PoGibas, мне нужно было загрузить несколько значений списка для приложения, вот аналогичное приложение, использующее reactiveValues
и observeEvent
:
library(shiny) # save a dummy RDS for loading saveRDS(list(names=LETTERS,numbers=seq(10)),'dummy.rds') # define initial values myDataList lt;- list(names=c("Tom","Dick","Harry"), numbers=seq(5)) ui lt;- shinyUI( fluidPage( fileInput("file1", "Choose file to upload", accept = ".rds"), selectInput("myNames","Names", ""), selectInput("myNumbers","Numbers", ""), tableOutput("contents") ) ) server lt;- function(input, output, session) { md lt;- reactiveValues( names = myDataList$names, numbers = myDataList$numbers ) observeEvent(input$file1,{ d lt;- readRDS(input$file1$datapath) for (n in names(d)){ md[[n]] lt;- d[[n]] } }) output$contents lt;- renderTable({ data.frame(data = c(md$names,md$numbers)) }) observe({ updateSelectInput(session, "myNames", label = "myNames", choices = md$names, selected = md$names[1]) updateSelectInput(session, "myNumbers", label = "myNumbers", choices = md$numbers, selected = md$numbers[1]) }) } shinyApp(ui, server)