# use non-exported function from teal.slice
include_css_files <- getFromNamespace("include_css_files", "teal.slice")
include_js_files <- getFromNamespace("include_js_files", "teal.slice")
DatetimeFilterState <- getFromNamespace("DatetimeFilterState", "teal.slice")
library(shiny)
filter_state <- DatetimeFilterState$new(
x = c(Sys.time() + seq(0, by = 3600, length.out = 10), NA),
slice = teal_slice(varname = "x", dataname = "data"),
extract_type = character(0)
)
isolate(filter_state$get_call())
filter_state$set_state(
teal_slice(
dataname = "data",
varname = "x",
selected = c(Sys.time() + 3L, Sys.time() + 8L),
keep_na = TRUE
)
)
isolate(filter_state$get_call())
# working filter in an app
library(shinyjs)
datetimes <- as.POSIXct(c("2012-01-01 12:00:00", "2020-01-01 12:00:00"))
data_datetime <- c(seq(from = datetimes[1], to = datetimes[2], length.out = 100), NA)
fs <- DatetimeFilterState$new(
x = data_datetime,
slice = teal_slice(
varname = "x", dataname = "data", selected = data_datetime[c(47, 98)], keep_na = TRUE
)
)
ui <- fluidPage(
useShinyjs(),
include_css_files(pattern = "filter-panel"),
include_js_files(pattern = "count-bar-labels"),
column(4, tags$div(
tags$h4("DatetimeFilterState"),
fs$ui("fs")
)),
column(4, tags$div(
id = "outputs", # div id is needed for toggling the element
tags$h4("Condition (i.e. call)"), # display the condition call generated by this FilterState
textOutput("condition_datetime"), tags$br(),
tags$h4("Unformatted state"), # display raw filter state
textOutput("unformatted_datetime"), tags$br(),
tags$h4("Formatted state"), # display human readable filter state
textOutput("formatted_datetime"), tags$br()
)),
column(4, tags$div(
tags$h4("Programmatic filter control"),
actionButton("button1_datetime", "set drop NA", width = "100%"), tags$br(),
actionButton("button2_datetime", "set keep NA", width = "100%"), tags$br(),
actionButton("button3_datetime", "set a range", width = "100%"), tags$br(),
actionButton("button4_datetime", "set full range", width = "100%"), tags$br(),
actionButton("button0_datetime", "set initial state", width = "100%"), tags$br()
))
)
server <- function(input, output, session) {
fs$server("fs")
output$condition_datetime <- renderPrint(fs$get_call())
output$formatted_datetime <- renderText(fs$format())
output$unformatted_datetime <- renderPrint(fs$get_state())
# modify filter state programmatically
observeEvent(
input$button1_datetime,
fs$set_state(teal_slice(dataname = "data", varname = "x", keep_na = FALSE))
)
observeEvent(
input$button2_datetime,
fs$set_state(teal_slice(dataname = "data", varname = "x", keep_na = TRUE))
)
observeEvent(
input$button3_datetime,
fs$set_state(
teal_slice(dataname = "data", varname = "x", selected = data_datetime[c(34, 56)])
)
)
observeEvent(
input$button4_datetime,
fs$set_state(
teal_slice(dataname = "data", varname = "x", selected = datetimes)
)
)
observeEvent(
input$button0_datetime,
fs$set_state(
teal_slice(
dataname = "data", varname = "x", selected = data_datetime[c(47, 98)], keep_na = TRUE
)
)
)
}
if (interactive()) {
shinyApp(ui, server)
}
Run the code above in your browser using DataLab