0

モジュール内で定義されているユーザー入力にアクセスしようとしています。以下のコードでは、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ことですが、明らかに機能しません。

4

1 に答える 1