'Can I subset a reactive dataframe by selectinput choices that come from the reactive dataframe?

Can you subset a reactive data frame by using the values of a selectinput() that was created based on this data frame? It seems like a paradox to me because every time the data frame is updated the selectinput() is updated too. I will use a small example of my thought that may help someone understand.

 location = c("100 ail","16th and Whitmore","40AB01 - ANTWERPEN","Abington") 
last = c("2018-02-01 09:30:00", "2018-02-01 03:00:00", "2017-03-07 10:00:00","2018-02-01 03:00:00") 
first = c("2015-09-01 00:00:00","2016-03-06 19:00:00","2016-11-22 15:00:00","2016-06-09 19:00:00") 
locations = data.frame(location, last, first)

library(shiny)
library(shinythemes)
library(htmltools)
library(DT)
library(utilr)
library(openair)
library(dplyr)
library(ropenaq)
library(worldmet)

  ui = fluidPage(theme = shinytheme("slate"),
  
  # title
  titlePanel("Select Dates of interest and location"),
  
  # first row; This allows a user to enter their start and stop dates
  fluidRow(
    column(3, wellPanel(
      
    )
    ),
    column(3, wellPanel(
      
    )
    ),
      column(
          width = 6
          
      )
  ),
  
  
  
  fluidRow(
      tabsetPanel(
          type = "tabs",
          # summary tab
          tabPanel(
              "  Select Dates and Location",
              uiOutput("loc"),
              uiOutput("dt"),
              shiny::dataTableOutput("merged")         
               
          ),                      
          
          # scenario tab.  Needs work.  Panel should include a summary of user choices (selected on previous panels) and then 
          # allow a user to enter their email address.  An action button would be pressed to create the output from OpenAir.
          tabPanel(
              "Selection Summary and Process Data",
              fluidRow(
                  # actionButton("goButton", "OpenAir Local!"),
                  # helpText("When you click the button above, you should see",
                  #          "the output below update to reflect the value you",
                  #          "entered at the top:"),
              
                  )
              
          
                  )
              )
          )
      )
  
#server.r
server = function(input, output, session) {
 #initial selectinput to create the initial dataframe
output$loc<-renderUI({
     selectInput("loc", label = h4("Choose location"),
                 choices = locations$location ,selected = 1
     )
   })
   
    rt<-reactive({
#dataframe creation
    AQ<- aq_measurements(location = input$loc) 
    )
    met <- importNOAA(year = 2014:2018)
    colnames(AQ)[9] <- "date"
    merged<-merge(AQ, met, by="date")
   
    merged$location <- gsub( " " , "+" , merged$location)
    merged
   
   
   })

#selectinput based on the dataframe
output$dt<-renderUI({
     selectInput("dt", label = h4("Choose Dates"), 
                 choices = as.character(rt()[,1]),
                 selected = 1,
                 multiple = T)
   })
   
     
#attempt to create a datatable by subseting the dataframe by the choices of selectinput   
   output$merged <- shiny::renderDataTable({
     a <- subset(rt(), rt()[,1] %in% input$dt)
   })
}
shinyApp(ui, server)


Solution 1:[1]

The problem was different. Shiny could not read the space between date time so i replaced it with a "+".

 output$loc<-renderUI({
     selectInput("loc", label = h4("Choose location"),
                 choices = locations$location ,selected = 1
     )
   })

   rt<-reactive({
     locations$location <- gsub( " " , "+" , locations$location)

   AQ<- aq_measurements(location = input$loc,date_from = as.Date(as.POSIXct(subset(locations$firstUpdated,(locations[,1]==input$loc))
   ,format="%Y-%m-%d %H:%M:%S")) 
   , date_to = as.Date(as.POSIXct(subset(locations$lastUpdated,(locations[,1]==input$loc)),format="%Y-%m-%d %H:%M:%S")) 
   )
   met <- importNOAA(year = 2014:2018)
   colnames(AQ)[9] <- "date"
   merged<-merge(AQ, met, by="date")
   # date output -- reports user-selected state & stop dates in UI
   merged$location <- gsub( " " , "+" , merged$location)
   merged$date <- gsub( " " , "+" , merged$date)
   merged


   })

   output$dt<-renderUI({
     selectInput("dt", label = h4("Choose Dates"), 
                 choices = as.character(rt()[,1]),
                 selected = 1
                 )
   })

   #DT  

   output$merged <- shiny::renderDataTable({


     subset(rt(),(rt()[,1]==input$dt))


   })

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 firmo23