モジュール内で定義されているユーザー入力にアクセスしようとしています。以下のコードでは、pickerInput
カスケードし、前の選択に依存する 3 つの選択があります。最後のpickerInput
(レベル 3) では、データセットがフィルター処理mpg
され、3 つの項目の下に表示されますpickerInput
。
Level3 の選択にアクセスして、サーバーの別の部分で使用する方法がわかりません。この場合は、 のフィルターとして使用しますmpg
。
以下はコードです:
library(shiny)
library(tidyverse)
library(shinyWidgets)
multiFilterUI <- function(id){
ns <- NS(id)
tagList(
fluidRow(
column(3, uiOutput(ns("level1"))),
column(3, uiOutput(ns("level2"))),
column(3, uiOutput(ns("level3")))
)
)
}
multiFilterServer <- function(id, data, col1, col2, col3){
moduleServer(
id,
function(input, output, session){
output$level1 <- renderUI({
ns <- session$ns
cs <- unique(data[[col1]])
pickerInput(ns("level1_select"), label = "Level1", choices = cs)
})
output$level2 <- renderUI({
ns <- session$ns
cs <- data %>% filter(!!sym(col1) %in% input$level1_select) %>%
distinct(!!sym(col2)) %>%
pull(!!sym(col2))
pickerInput(ns("level2_select"), label = "Level2", choices = cs)
})
output$level3 <- renderUI({
ns <- session$ns
cs <- data %>% filter(!!sym(col2) %in% input$level2_select) %>%
distinct(!!sym(col3)) %>%
pull(!!sym(col3))
pickerInput(ns("level3_select"), label = "Level3", choices = cs)
})
}
)
}
ui <- fluidPage(
multiFilterUI("test"),
dataTableOutput("dt")
)
server <- function(input, output, session) {
multiFilterServer("test", mpg, "manufacturer", "model", "trans")
output$dt <- renderDataTable({
mpg %>% filter(trans %in% input$level3_select)
})
}
shinyApp(ui, server)
私の試みはアクセスするlevel3_select
ことですが、明らかに機能しません。