barrrr
barrrr

Reputation: 21

rshiny render time slider or selector

I want to render a interactive Slider or Time Selector in R-Shiny First I select A Variable from a list and according to that selection I want to choose the time intervals from that data.

library("shiny")
Dates = as.POSIXct(c("2018-09-27 23:00:00","2018-09-28 23:00:00","2018-09-29 23:00:00","2018-09-30 23:00:00","2018-10-01 23:00:00")) 
ID = factor(c("2090493005FT", "00209049300S", "0209049300SE", "0209049300SE", "00020904930SE"))   
df <- data.frame(ID = ID,Time = Dates)

ui <- fluidPage(
       fluidRow(
            column(width = 12, offset = 1,
                          selectInput("select", label = h3("Zaehlpunkt"), 
                                      choices = levels(df$ID), 
                                      selected = 1, multiple = TRUE
                                     )
                  )
               ),
uiOutput("Slider")
)
server <- function(input, output, session) {

MinZeitSubset <-  reactive({
  ds<- subset(df,ID == input$select)
  MinZeit <- min(df$Time)
  return(MinZeit)
    })
MaxZeitSubset <-  reactive({
  ds<- subset(df,Zaehlpunkt == input$select)
  MaxZeit <- max(df$TIme)
  return(MaxZeit)
   })
output$Slider<-renderUI({dateRangeInput(inputId = "daterange", 
                                         label = "Zeitabschnitt", 
                                         start = MinZeitSubset, 
                                         end = MaxZeitSubset, 
                                         min = MinZeitSubset,
                                         max = MaxZeitSubset, 
                                         autoclose = TRUE 
                                        )                    
                       })

                                     }
shinyApp(ui,server)

I get this Error Message:

Error in as.vector: cannot coerce type 'closure' to vector of type 'character' [No stack trace available]

I was able to plot a datatable but I couldn't render a slider or data range object! Any help?

Upvotes: 2

Views: 255

Answers (1)

Anders Ellern Bilgrau
Anders Ellern Bilgrau

Reputation: 10233

You need call the reactive functions with no arguments, i.e. MinZeitSubset() and not MinZeitSubset. So modifying your renderUI to

output$Slider <- renderUI({dateRangeInput(inputId = "daterange", 
                                          label = "Zeitabschnitt", 
                                          start = MinZeitSubset(), 
                                          end = MaxZeitSubset(), 
                                          min = MinZeitSubset(),
                                          max = MaxZeitSubset(), 
                                          autoclose = TRUE) 

should work as MinZeitSubset and MaxZeitSubset are functions.

When I ran your code, I got the error that the Zaehlpunkt was missing within the subsetting in MaxZeitSubset. Using ID instead gets everything to work:

library("shiny")
Dates = as.POSIXct(c("2018-09-27 23:00:00","2018-09-28 23:00:00","2018-09-29 23:00:00","2018-09-30 23:00:00","2018-10-01 23:00:00")) 
ID = factor(c("2090493005FT", "00209049300S", "0209049300SE", "0209049300SE", "00020904930SE"))   
df <- data.frame(ID = ID,Time = Dates)

ui <- fluidPage(
  fluidRow(
    column(width = 12, offset = 1,
           selectInput("select", label = h3("Zaehlpunkt"), 
                       choices = levels(df$ID), 
                       selected = 1, multiple = TRUE
           )
    )
  ),
  uiOutput("Slider")
)

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

  MinZeitSubset <-  reactive({
    ds <- subset(df,ID == input$select)
    MinZeit <- min(df$Time)
    return(MinZeit)
  })

  MaxZeitSubset <-  reactive({
    ds<- subset(df, ID == input$select)
    MaxZeit <- max(df$TIme)
    return(MaxZeit)
  })


  output$Slider<-renderUI({dateRangeInput(inputId = "daterange", 
                                      label = "Zeitabschnitt", 
                                      start = MinZeitSubset(), 
                                      end = MaxZeitSubset(), 
                                      min = MinZeitSubset(),
                                      max = MaxZeitSubset(), 
                                      autoclose = TRUE 
  )                    
  })

}

shinyApp(ui,server)

Upvotes: 1

Related Questions