對於示例數據集mtcars
,我們希望使用"cyl","am","carb","gear"
作爲候選過濾器(selectInput小部件)。用戶應該能夠選擇他們想要的過濾器。R Shiny:嵌套觀察函數
對於每個篩選出的篩選器,都有一個與其關聯的「(全部)全選」按鈕。
我的問題是,由於過濾器的數量不固定,因此生成observeEvent
語句的循環語句必須位於另一個observe
函數中。
請運行以下可重複的代碼。
任何建議,使'(un)全選'botton工作?謝謝。
library(ggplot2)
library(shiny)
server <- function(input, output, session) {
R = mtcars[,c("cyl","am","carb","gear")]
output$FILTERS = renderUI({
selectInput("filters","Filters",choices = names(R),multiple = TRUE)
})
#this observe generates filters(selectInput widgets) dynamically, not important
observe({
req(input$filters)
filter_names = input$filters
# count how many filters I selected
n = length(filter_names)
# to render n selectInput
lapply(1:n,function(x){
output[[paste0("FILTER_",x)]] = renderUI({
req(input$filters)
div(
selectInput(paste0("filter_",x),
paste0(filter_names[x]),
choices = unique(R[,filter_names[x]]),
multiple = TRUE,
selected = unique(R[,filter_names[x]])
),
actionButton(paste0("filter_all_",x),"(Un)Select All")
)
})
})
# this renders all the selectInput widgets
output$FILTER_GROUP = renderUI({
lapply(1:n, function(i){
uiOutput(paste0("FILTER_",i))
})
})
})
#################### issue begins #####################
observe(
n = length(input$filters)
lapply(
1:n,
FUN = function(i){
Filter = paste0("filter_",i)
botton = paste0("filter_all_",i)
observeEvent(botton,{
NAME = input$filters[i]
choices = unique(mtcars[,NAME])
if (is.null(input[[Filter]])) {
updateCheckboxGroupInput(
session = session, inputId = Filter, selected = as.character(choices)
)
} else {
updateCheckboxGroupInput(
session = session, inputId = Filter, selected = ""
)
}
})
}
)
)
#################### issue ends #####################
})
ui <- fluidPage(
uiOutput("FILTERS"),
hr(),
uiOutput("FILTER_GROUP")
)
shinyApp(ui = ui, server = server)
如果我們使用'dropdownButton'部件看看這個答案http://stackoverflow.com/questions/40631788/shiny-observe-triggered-by-dynamicaly-generated-inputs/40643541#40643541 – Geovany