[R-es] Shiny problemas con updateSelectInput

José Luis Cañadas canadasreche en gmail.com
Vie Abr 21 13:01:59 CEST 2017


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