Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Update Shiny's 'selectInput' dropdown with new values after uploading new data using fileInput

Tags:

r

shiny

I have a Shiny app that includes a number of dropdown selection boxes, the values of which are filled from reading an RDS file. The app also includes a fileInput function to upload new data. How can I change the values in the dropdown boxes to reflect the new data? Currently I can see that the data is uploaded, but the old data remains in the dropdown.

The data that should be uploaded is saved to a file using

saveRDS( data.frame(names=c("Jill","Jane","Megan")),"myDataFrame.rds")

In my app.R file, I first define the 'default' value of the data:

myDataFrame <- data.frame(names=c("Tom","Dick","Harry"))

The content of my app.R is as follows:

library(shiny)
ui <- shinyUI(
 fluidPage(
  fileInput('file1', 'Choose file to upload',accept = ".rds"),
  selectInput("myNames","Names",myDataFrame$names),
  tableOutput('contents')
 )
)

server <- shinyServer(function(input, output) {
  output$contents <- renderTable({
    inFile <- input$file1
    if (is.null(inFile)) { return(myDataFrame) }
    readRDS(inFile$datapath)
  })
  })

The initial view of the application is as expected: both the dropdown and the table contain the 'default' names. Upon upload of my RDS file containing a new dataframe, the table changes (which is what I was looking for) but the dropdown values do not. How can I make the latter happen?

like image 583
janverkade Avatar asked Sep 21 '17 14:09

janverkade


1 Answers

I added reactive object myData that you have to use for table contents, but more importantly to update choices in selectInput (check observe and updateSelectInput part).

library(shiny)

ui <- shinyUI(
    fluidPage(
        fileInput("file1", "Choose file to upload", accept = ".rds"),
        selectInput("myNames","Names", ""),
        tableOutput("contents")
    )
)

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

    myData <- reactive({
        inFile <- input$file1
        if (is.null(inFile)) {
            d <- myDataFrame
        } else {
            d <- readRDS(inFile$datapath)
        }
        d
    })

    output$contents <- renderTable({
        myData()
    })

    observe({
         updateSelectInput(session, "myNames",
                           label = "myNames",
                           choices = myData()$names,
                           selected = myData()$names[1])
    })

}

shinyApp(ui, server)
like image 175
pogibas Avatar answered Oct 05 '22 23:10

pogibas