Обновите раскрывающийся список Shiny «selectInput» новыми значениями после загрузки новых данных с помощью fileInput

#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)