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.

Utilizando dos selectInput dependientes para filtrar un dataframe en R Shiny

¡Hola comunidad increíble!

Estoy tratando de crear un panel de control de un dataframe que permita filtrar el dataframe por los niveles dentro de una columna seleccionada. Esto significa tener un primer pickerInput donde el usuario selecciona la columna, y luego un segundo pickerInput hijo donde se generan las opciones basadas en la columna seleccionada. He encontrado una forma de hacer que los pickerInput sean dependientes entre sí, pero por alguna razón, cuando intento aplicar el filtrado, mi dataframe tiene valores cero y no puedo entender por qué.

Por favor, vea el reprex creado con el conjunto de datos “mtcars”.

library(shiny)
library(shinyWidgets)
library(dplyr)
library(DT)
data(mtcars)
ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(uiOutput('select_filter'),
                 uiOutput('filter')),
    mainPanel(
      dataTableOutput('table')
    )
  )
)
server <- function(input, output, session) {
  data<-mtcars
  categories<-c('cyl', 'vs', 'am', 'gear', 'carb')

  output$select_filter <- renderUI({
    pickerInput("select_filter", "Select flexi filter",
                choices = levels(as.factor(categories)))
  })

  output$filter <- renderUI({
    pickerInput("filter", "Flexi filter",
                choices = unique(data[,input$select_filter]),
                options = list('actions-box'=TRUE), multiple=TRUE,
                selected = unique(data[,input$select_filter]))
  })

  filtered_data <- reactive ({
    data %>% filter(input$select_filter %in% input$filter)
  })

  output$table <- renderDataTable(filtered_data())
}

shinyApp(ui, server)

¡Cualquier ayuda será muy apreciada! Si se necesita más información, por favor háganmelo saber. Saludos.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Hola,

    En tu código, el problema es el uso de categories en lugar de data al generar pickerInput para filter. Aquí está el código corregido:

    library(shiny)
    library(shinyWidgets)
    library(dplyr)
    library(DT)
    data(mtcars)
    
    ui <- fluidPage(
      sidebarLayout(
        sidebarPanel(uiOutput('select_filter'),
                     uiOutput('filter')),
        mainPanel(dataTableOutput('table')
                  )
      )
    )
    
    server <- function(input, output, session) {
      data <- mtcars
      categories <- c('cyl', 'vs', 'am', 'gear', 'carb')
    
      output$select_filter <- renderUI({
        pickerInput("select_filter", "Selecciona el filtro flexible", 
                    choices = categories)
      })
    
      output$filter <- renderUI({
        pickerInput("filter", "Filtro flexible", 
                    choices = unique(data[,input$select_filter]),
                    options = list('actions-box'=TRUE), 
                    multiple=TRUE,
                    selected = unique(data[,input$select_filter]))
      })
    
      filtered_data <- reactive({
        data %>% 
          filter(data[[input$select_filter]] %in% input$filter)
      })
    
      output$table <- renderDataTable(filtered_data())
    }
    
    shinyApp(ui, server)
    

    Espero que esto ayude. Avísame si tienes alguna otra pregunta o inquietud. ¡Feliz programación!

Comments are closed.