Re: [R-es] Shiny problemas con updateSelectInput

2017-04-24 Por tema José Luis Cañadas
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 (<
canadasre...@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]]

___
R-help-es mailing list
R-help-es@r-project.org
https://stat.ethz.ch/mailman/listinfo/r-help-es


[R-es] Shiny problemas con updateSelectInput

2017-04-21 Por tema José Luis Cañadas
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]]

___
R-help-es mailing list
R-help-es@r-project.org
https://stat.ethz.ch/mailman/listinfo/r-help-es