[R-es] Shiny problemas con updateSelectInput

José Luis Cañadas canadasreche en gmail.com
Lun Abr 24 12:44:59 CEST 2017


Buenas,
La solución que he encontrado (más bien la que un amigo me ha sugerido) es
usar uiOuput y renderUI para crear un ui dinámico que cambie según uno de
los input.

En el ejemplo sería algo así.

---
title: "Test observe"
output: html_document
runtime: shiny
---



```{r echo=FALSE}

datos <- mtcars
datos <- split(datos, datos$cyl )
un_cyl <- unique(mtcars$cyl)
gears <- c(3,4,5)
disp_list <- unique(mtcars$disp)


inputPanel(
 selectInput("cyl", label = "cyl",
              choices = un_cyl),
 uiOutput("ui")
)


output$ui <- renderUI({
  eventos <- datos[[as.character(input$cyl)]]
  tmp <- unique(eventos$disp)
  selectInput("disp", label="Disp", choices = tmp, selected = tmp[1])
})







El vie., 21 abr. 2017 a las 13:01, José Luis Cañadas (<
canadasreche en gmail.com>) escribió:

> Buenas a todos.
>
> Os cuento mi problema.
> Tengo un documento rmd interactivo, con shiny y quiero que un selectinput
> se actualice según lo seleccionado en otro selectInput.
> En realidad lo que quiero con el primer selectInput es seleccionar un
> data.frame de una lista de data.frame, y que se actulaice el segundo
> selectInput con los valores únicos de una variable del data.frame elegido.
>
> El caso es que no consigo hacerlo funcionar. Sin embargo, si en vez de una
> lista de data.frame tengo un solo data.frame y con el primer selectInput
> hago un subset si funciona. Os pongo dos ejemplso reproducibles para que se
> vea mejor.
>
>
> Ejemplo 1. Subset de un data.frame. Si funciona. Al seleccionar un valor
> de cyl en  el documento resultante se actualiza la lista de disp
> disponibles sólo a los que están en ese data.frame
>
>
> ---
> title: "Test observe"
> output: html_document
> runtime: shiny
> ---
>
>
>
> ```{r echo=FALSE}
>
> datos <- mtcars
> # datos <- split(datos, datos$cyl )
> un_cyl <- unique(mtcars$cyl)
> gears <- c(3,4,5)
> disp_list <- unique(mtcars$disp)
>
>
> inputPanel(
>  selectInput("cyl", label = "cyl",
>               choices = un_cyl),
>   selectInput("disp", label = "disp",
>               choices = disp_list,  selected = disp_list[1])
> )
>
>
> eventos_sel <- reactive({
>   eventos <- datos[datos$cyl == input$cyl,]
>   eventos
> })
>
>
> elegibles <- reactive({
>   tmp <- eventos_sel()
>   tmp <- unique(tmp$disp)
>   return(tmp)
> })
>
> # hacer un updateSelectInput
>
> observe({
>   updateSelectInput(session, inputId = "disp", choices = elegibles())
>   })
>
>
> renderPrint(elegibles())
>
>
> ```
>
>
> Ejemplo 2. Elegir un data.frame de una lista. No funciona.  Da
> error  Error in [[: attempt to select less than one element in get1index.
> Aunque si comento el observe, se ve qeu en renderPrint(elegibles()) si que
> está bien.  Pongo en negrita los cambios con respecto al ejemplo 1
>
> ---
> title: "Test observe"
> output: html_document
> runtime: shiny
> ---
>
>
>
> ```{r echo=FALSE}
>
> datos <- mtcars
>
> # creo lista de data.frame, cada elemento tiene nombre del
> # cyl
>
> *datos <- split(datos, datos$cyl )*
> un_cyl <- unique(mtcars$cyl)
> gears <- c(3,4,5)
> disp_list <- unique(mtcars$disp)
>
>
> inputPanel(
>  selectInput("cyl", label = "cyl",
>               choices = un_cyl),
>   selectInput("disp", label = "disp",
>               choices = disp_list,  selected = disp_list[1])
> )
>
>
> eventos_sel <- reactive({
> *  eventos <- datos[[input$cyl]]*
>   eventos
> })
>
>
> elegibles <- reactive({
>   tmp <- eventos_sel()
>   tmp <- unique(tmp$disp)
>   return(tmp)
> })
>
> # hacer un updateSelectInput
>
> observe({
>   updateSelectInput(session, inputId = "disp", choices = elegibles())
>   })
>
>
> renderPrint(elegibles())
>
>
> ```
>
> Gracias
>
>
>
>

	[[alternative HTML version deleted]]



Más información sobre la lista de distribución R-help-es