Brillante: filtros de datos dinámicos con insertUI
Soy nuevo en shiny y estaba tratando de escribir una aplicación donde el usuario pueda agregar dinámicamente filtros de datos (vea el código a continuación). Pensé que insertUI y remove UI son geniales para ese propósito. Sin embargo, tengo varios problemas:
1) I cannot address dynamically generates input$ids (see filterId in the code, l. 36 and l. 58)
2) in updateCheckboxGroupInput (l. 62) checkboxes are not preselected.
3) I cannot select data rows using which() (l. 74)
4) The checkboxes are not displayed inside the column, but spread over the whole page.
Aprecio mucho cualquier pista.
Gracias Jordi
aqui el codigo:
library(shiny)
rowvalues <- function(col,data) {
as.list(unique(data[col]))
}
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
fluidRow(
column(6, actionButton('addFilter', 'Add filter')),
column(6, actionButton('removeFilter', 'Remove filter')),
offset = 6
),
tags$hr(),
tags$div(id = 'placeholderAddRemFilt'),
tags$div(id = 'placeholderFilter'),
width = 4 # sidebar
),
mainPanel(
tableOutput("data")
)
)
)
server <- function(input, output,session) {
filter <- character(0)
observeEvent(input$addFilter, {
add <- input$addFilter
filterId <- paste0('Filter', add)
headers <- names(mtcars)
insertUI(
selector = '#placeholderFilter',
ui = tags$div(
# selectInput(filterId, label = paste0("Filter ",add), # does not work
selectInput("ColFilter", label = paste0("Filter ",add),
choices = as.list(headers),
selected = 1),
checkboxGroupInput("RowFilter", label = "Select variable values",
choices = NULL, selected = NULL,
inline = TRUE, width = 4000),
id = filterId
)
)
filter <<- c(filter,filterId)
})
observeEvent(input$removeFilter, {
removeUI(
## pass in appropriate div id
selector = paste0('#', filter[length(filter)])
)
filter <<- filter[-length(filter)]
})
# observeEvent(input$filterId, { # does ntót work
observeEvent(input$ColFilter, {
col <- input$ColFilter
values <- as.list(unique(mtcars[col]))[[1]]
updateCheckboxGroupInput(session,"RowFilter", label = "Select variable values",
choices = values, selected = values,
inline = TRUE)
})
output$data <- renderTable({
col <- input$ColFilter
rows <- input$RowFilter
print(c("selected col: ",col))
print(c("selected rows: ",as.vector(rows)))
if(is.null(col)) mtcars
else {
mtcars[which(mtcars$col != rows),]
}
})
}
shinyApp(ui = ui, server = server)