Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

169
Views
Evite que pickerInput se actualice cada vez que se seleccione algo (R, Shiny)

He buscado en stackoverflow y en la web completa, pero no puedo encontrar una buena respuesta a este problema aparentemente simple.

La situación es la siguiente:

  • Tengo una aplicación Shiny, conectada con una base de datos.
  • Tengo varias entradas de usuario (Pickerinputs), donde un usuario puede seleccionar varios argumentos
  • Las entradas del usuario dependen unas de otras

El problema que se presenta es el siguiente:

  • Si un usuario marca varias marcas de automóviles (por ejemplo, Renault, Peugeot y BMW), la entrada del selector que está vinculada a esta selección (modelos de automóviles específicos para estas marcas) se actualiza tres veces. Con muchas entradas de selector que están vinculadas entre sí, esto crea una experiencia de usuario desordenada.

Solución necesaria

  • Creo que la solución es simple: el pickerinput solo necesita enviar los valores seleccionados después de que se haya cerrado la entrada; no necesita enviar valores (y desencadenar actualizaciones) después de cada elección que hace un usuario. AirdatePickerInput de Shinywidgets tiene esta característica específica ( update_on=c('change', 'close') . Lo que necesito es que mi pickerInput se actualice solo en 'close'. Para que los valores resultantes se envíen solo una vez al servidor .

Ejemplo: interfaz de usuario

 ui <- fluidPage( # Title panel fluidRow( column(2, wellPanel( h3("Filters"), uiOutput("picker_a"), uiOutput("picker_b"), ) ), ) )

Servidor

 server <- function(input, output, session) { # Start values for each filter all_values_for_a <- tbl(conn, "table") %>% distinct(a) %>% collect() all_values_for_b <- tbl(conn, "table") %>% distinct(b) %>% collect() output$picker_a <- renderUI({ pickerInput( inputId = "picker_a", label = "a:", choices = all_values_for_a, selected = all_values_for_a, multiple = TRUE, options = list("live-search" = TRUE, "actions-box" = TRUE)) }) output$picker_b <- renderUI({ pickerInput( inputId = "picker_b", label = "b:", choices = all_values_for_b, selected = all_values_for_b, multiple = TRUE, options = list("live-search" = TRUE, "actions-box" = TRUE)) }) #I want this code to be executed ONLY when #picker_a is closed, not everytime when the user #picks an item in picker_a observeEvent( input$picker_a, { all_values_for_b <- tbl(conn, "table") %>% filter(a %in% !!input$picker_a) %>% distinct(b) %>% collect() updatePickerInput(session, "picker_b", choices = all_values_for_b, selected = all_values_for_b) }) ) ) }
about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

Probablemente pueda usar un botón de acción para retrasar la ejecución de la actualización una vez que el usuario haya seleccionado todos los valores.

O use una función de debounce , vea esta otra publicación .

EDITAR

Se solicitó la update_on = c("change", "close") para el widget pickerInput al desarrollador de shinyWidgets (Victor Perrier) en GitHub .

La respuesta de Víctor fue:

no hay un argumento similar para pickerInput, pero hay una entrada especial para saber si el menú está abierto o no. Entonces puede usar un valor reactivo intermedio para lograr el mismo resultado.

y proporcionó el siguiente código:

 library(shiny) library(shinyWidgets) ui <- fluidPage( fluidRow( column( width = 4, pickerInput( inputId = "ID", label = "Select:", choices = month.name, multiple = TRUE ) ), column( width = 4, "Immediate:", verbatimTextOutput("value1"), "Updated after close:", verbatimTextOutput("value2") ), column( width = 4, "Is picker open ?", verbatimTextOutput("state") ) ) ) server <- function(input, output) { output$value1 <- renderPrint(input$ID) output$value2 <- renderPrint(rv$ID_delayed) output$state <- renderPrint(input$ID_open) rv <- reactiveValues() observeEvent(input$ID_open, { if (!isTRUE(input$ID_open)) { rv$ID_delayed <- input$ID } }) } shinyApp(ui, server)

En tu caso podrías probar:

 observeEvent( input$picker_a_open, { if (!isTRUE(input$picker_a_open)) { all_values_for_b <- tbl(conn, "table") %>% filter(a %in% !!input$picker_a) %>% distinct(b) %>% collect() updatePickerInput(session, "picker_b", choices = all_values_for_b, selected = all_values_for_b) } })
about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!