'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 |
