0

I want to update one of my selectInputs, "variable" with a reactive list of countries that will change depending on the dataset that is selected in another selectInput, "Databases". I want the default list of choices to be the "Home File" dataset that is loaded when the app runs but I want to have the option of switching to an uploaded file. The files I plan to upload will all have the list of countries under the "Countries" column to match the home_df column. Ideally the list will refresh anytime the dataset is switched.

So far I have tried this but cant seem to return the values I want:

Values <- c(145540,145560, 157247, 145566)
Countries <- c(US, Canada, Ireland, Spain)
Zipcodes <- c(145592, 145560, 145566, NA)

home_df <- data.frame(Values , Countries , Zipcodes )
ui <- fluidPage(
 tabPanel(
    "first_plot",
    tabsetPanel(
      id = "firstPanel",
      type = "tabs",
      tabPanel("File Upload",
               # Sidebar layout with input and output definitions ----
               sidebarLayout(
                 # Sidebar panel for inputs ----
                 sidebarPanel(
                   # Input: Select a file ----
                   fileInput(
                     "file1",
                     "Choose CSV File",
                     multiple = FALSE,
                     accept = c("text/csv",
                                "text/comma-separated-values,text/plain",
                                ".csv")
                   ),
                   
                   # Horizontal line ----
                   tags$hr(),
                   
                   # Input: Checkbox if file has header ----
                   checkboxInput("header", "Header", TRUE),
                   
                   # Input: Select separator ----
                   radioButtons(
                     "sep",
                     "Separator",
                     choices = c(
                       Comma = ",",
                       Semicolon = ";",
                       Tab = "\t"
                     ),
                     selected = ","
                   ),
                   
                   # Input: Select quotes ----
                   radioButtons(
                     "quote",
                     "Quote",
                     choices = c(
                       None = "",
                       "Double Quote" = '"',
                       "Single Quote" = "'"
                     ),
                     selected = '"'
                   ),
                   
                   # Horizontal line ----
                   tags$hr(),
                   
                   # Input: Select number of rows to display ----
                   radioButtons(
                     "disp",
                     "Display",
                     choices = c(Head = "head",
                                 All = "all"),
                     selected = "head"
                   )
                   
                 ),

                 mainPanel(# Output: Data file ----
                           tableOutput("contents"))
               )),

 tabPanel("first_plot",
               uiOutput("box"))






server <- function(input, output, session) {
  my_data <- reactive({
    inFile <- input$file1
    req(inFile)
    
    # when reading semicolon separated files,
    # having a comma separator causes `read.csv` to error
    tryCatch({
      df_x <<- read.csv(
        inFile$datapath,
        header = input$header,
        sep = input$sep,
        quote = input$quote
      )
      
    },
    error = function(e) {
      # return a safeError if a parsing error occurs
      stop(safeError(e))
    })
    
    if (input$disp == "head") {
      return(head(df_x))
    }
    else {
      return(df_x)
    }
  })
}



   datasetInput <- reactiveValues(
    if (input$exp_pr_box == "Home File"){
      dataset <- home_df
    }
    else if (input$exp_pr_box == "Uploaded DB"){
      dataset <- my_data()
    }
    return(dataset)
  )
  

md <- reactiveValues(
    list = datasetInput$Countries
  )

  observeEvent(datasetInput(),
                  updateSelectInput(session, "variable", choices=md()))
  

  

  output$box <- renderUI({
    tabPanel(
      "first_plot",
      sidebarPanel(
        selectInput(
          "exp_pr_box",
          "Database",
          choices = c("Home File", "Uploaded DB")
        ),  ----
        selectInput("variable", "Selection:", choices=NULL, selected = NULL
        )
       )
      ),
      mainPanel(
        h3("plot title", align = "center"),
        plotlyOutput("plot", height = '1000px', width = "100%")
     )
    )
  })
  

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

  output$plot <-  renderPlotly(
        ggplot(dx) +
          geom_boxplot(col = c("#69b3a2", "red")) +
          geom_line(data = dx, aes(group = paired), color =
                      "grey"))


shinyApp(ui, server)
Munrock
  • 403
  • 1
  • 11

1 Answers1

0

I was able to solve the issue with the help of this post (R Shiny - How to update a dependent reactive selectInput before updating dependent reactive plot)

And by storing the list in the reactive. For some reason using the names function as was done in the example did not output the list for me but worked after removing it

  md <- reactive({
         my_list = input_dataset()
       })
  
  observeEvent(input$exp_pr_box, {
    freezeReactiveValue(input, "variable")
    updateSelectInput(session = session, inputId = "variable", choices = unique(str_to_title(md())))
  })

Munrock
  • 403
  • 1
  • 11