es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

SliderInput brillante que muestra valores duplicados

Tengo un problema con sliderInput. En mi aplicación, cuando un usuario carga datos (actionBTTN), los años de mi sliderInput se actualizan (con updateSliderInput) según esos datos. Pero he notado que para datos que contienen pocos años (4-5), el sliderInput muestra años repetidos. También he notado que esto parece ocurrir solo cuando el tamaño de mi pantalla es más grande.

Así es cómo se ve con una ventana de tamaño pequeño: no se repiten los valores de los años, como me gustaría que estuviera en la aplicación. Y así es cómo se ve con una ventana más grande: valores duplicados de los años.

Aquí tienes un ejemplo de mi aplicación:

library(shiny)
library(shinyWidgets)

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      # input inicial sin años seleccionados, se actualizará una vez que se carguen los datos
      sliderInput(
        inputId = "years", 
        label = "Elige un rango de tiempo:", 
        min = 0, max = 1, 
        value = c(0,1), 
        #dragRange = TRUE, 
        step = 1, 
        sep = ''
      ),
      actionBttn(
        inputId = "load_data",
        label = "¡Obtener datos!",
        color = "primary",
        style = "fill", 
        icon = icon("arrow-alt-circle-down"),
        size = "xs",
        block = TRUE
      )
    ),
    mainPanel()
  )
)

server = function(input, output, session) {
  observeEvent(input$load_data, {
    mydata <- data.frame(numbers = c(1:5), year = c(2010:2014))

    minim <- min(mydata$year)
    maxim <- max(mydata$year)

    updateSliderInput(session, inputId = "years",
                     min = minim, max = maxim, 
                     value = c(minim, maxim),
                     # calcular el paso dinámicamente (idea de @Isa)
                     step = seq(minim, maxim, length.out = length(mydata$year))[2] - seq(minim, maxim, length.out = length(mydata$year))[1])
  })
}

shinyApp(ui, server)

Ya he intentado cambiar los argumentos step y sep, también he configurado mydata$year como un número entero. ¿Alguien ha encontrado el mismo problema? Cualquier ayuda es bienvenida.

¡Gracias! 🙂

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución para valores de año duplicados en sliderInput

    El problema con valores de año duplicados en sliderInput es causado por el argumento length.out dentro de la función seq utilizado para calcular el tamaño del paso. En casos donde la longitud de los datos es pequeña, este argumento puede producir valores repetidos en la secuencia, lo que lleva a años duplicados en el slider.

    Para solucionar este problema, reemplaza la función seq dentro de updateSliderInput con la función seq_along. Esto creará una secuencia de valores únicos correspondientes a la longitud de los datos.

    Aquí está el código actualizado:

    server = function(input, output, session) {
      observeEvent(input$load_data, {
        mydata <- data.frame(numbers = c(1:5), year = c(2010:2014))
    
        minim <- min(mydata$year)
        maxim <- max(mydata$year)
    
        updateSliderInput(session, inputId = "years",
                          min = minim, max = maxim, 
                          value = c(minim, maxim),
                          step = (maxim - minim + 1) / length(mydata$year),
                          # utiliza seq_along para evitar valores repetidos
                          tickInterval = 1,
                          labels = seq_along(mydata$year))
      })
    }
    

    El argumento tickInterval establece la distancia entre cada marca de división en el slider, y el argumento labels establece el texto que se mostrará junto a cada marca.

    Con estos cambios, sliderInput siempre mostrará valores de año únicos, independientemente del tamaño de los datos o de la pantalla.

Comments are closed.