Saltar al contenido

Shiny Slider Input paso a mes

Después de de una prolongada recopilación de datos dimos con la solución esta pregunta que suelen tener ciertos usuarios. Te brindamos la solución y nuestro deseo es serte de gran ayuda.

Solución:

Hay un timeFormat función dentro de la sliderInput. Para obtener más información, visite Widget de entrada de control deslizante.

EDITAR:

Para obtener las fechas y usarlas más adelante en su análisis, se le debe mucho crédito a esta pregunta Primer día del mes de una fecha y hora POSIXct usando lubridate y la función provista por Roland.

rm(list=ls())
library(shiny)
monthStart <- function(x) 
  x <- as.POSIXlt(x)
  x$mday <- 1
  as.Date(x)

ui <- basicPage(sliderInput("slider", "Time", min = as.Date("2010-01-01"),max =as.Date("2014-12-01"),value=as.Date("2014-12-01"),timeFormat="%b %Y"),
                textOutput("SliderText")
                )
server <- shinyServer(function(input, output, session)

  sliderMonth <- reactiveValues()
  observe(
    full.date <- as.POSIXct(input$slider, tz="GMT")
    sliderMonth$Month <- as.character(monthStart(full.date))
  )
  output$SliderText <- renderText(sliderMonth$Month)
)
shinyApp(ui = ui, server = server)

ingrese la descripción de la imagen aquí

Esta es una solución que uso, pero primero me gustaría explicar la lógica:

  1. Como se ha mencionado más arriba, timeFormat argumento de la sliderInput() La función no proporciona la funcionalidad de paso de 1 mes requerida. En cambio, simplemente formatea los datos diarios subyacentes, por lo que los pasos permanecen intactos en un incremento diario.
  2. sliderInput() tiene otro argumento step que se puede utilizar para definir explícitamente el incremento escalonado. Sin embargo, requiere un solo entero como entrada y, por lo tanto, no acepta vectores/rango. Dado que los meses tienen diferentes duraciones, no es correcto usar un solo número entero aquí. traté de usar lubridate::months(1) y lubridate::period(1, units = "months") -- fue en vano, lamentablemente, ya que ambos se convirtieron automáticamente a un número entero de 30 una vez que la aplicación los representó, por lo tanto, los incrementos mensuales no se mantuvieron.

Encontré una solución con shinyWidgets::sliderTextInput() que crea un control deslizante de caracteres.

Suponiendo que sus fechas se almacenan como yyyy-mm-dd fechas en columna Date de mesa d:

sliderTextInput(
  inputId    = "myID",
  label      = "myLabel",
  choices    = as.yearmon(unique(d$Date)),
  selected   = c(as.yearmon(min(d$Date)), as.yearmon(max(d$Date))),
  grid       = TRUE,
  width      = "100%"
)

Con esto usted siempre paso a incrementos mensuales. as.yearmon() se usa para que su aplicación muestre etiquetas deslizantes en el MMM YYYY formato.

Tenga en cuenta que la salida del control deslizante es un carácter, por lo que debe volver a transformarse en fecha:

  • as.Date(as.yearmon(input$myID[1])) para comenzar
  • as.Date(as.yearmon(input$myID[2])) para un final

Sección de Reseñas y Valoraciones

Acuérdate de que te brindamos la opción de explicar si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *