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]]