根据使用带有闪亮模块的依赖渲染UI创建的输入过滤数据帧

问题描述 投票:0回答:1

我目前正在尝试创建一个应用程序,该应用程序接收大型数据帧,然后根据上传的数据帧中的列进行过滤,然后再为用户显示表格。当我尝试根据相关输入的值进行过滤时,收到一条错误消息,指出过滤器值必须是“[数据帧的大小] 或 1,而不是大小 0”。我可以渲染值的输出,只是不使用它进行过滤。

我是编写模块的新手,所以可能有一些非常明显的东西我遗漏了,但我还没有能够解决它。


#Reprex modules

library(shiny)
library(bslib)
library(DT)
library(tidyverse)


testUI<-function(id){
  
  ns<-NS(id)
  tagList(
    layout_columns(selectInput(ns("carb"), "Carb", choices = seq(1:10), selected = 4),
                   uiOutput(ns("cyl"))),
    tableOutput(ns("table")),
    tableOutput(ns("table_ouput"))
    # textOutput(ns("cyl_text"))
    
  )
  
}

###initial filter function in UI to make dynamic dummy dataframe
fetchServer <- function(id) {
  
  moduleServer(id, function(input, output, session) {
    
    ns<-session$ns
    
     return(reactive(input$carb))
    
  })
}

##the initial data frame where the filtering column is located
testServer <- function(id, .carb) {

  moduleServer(id, function(input, output, session) {

    ns<-session$ns

    data<-reactiveValues(data = NULL)
    
    observe(data$data<-mtcars%>%filter(carb == .carb()))

    output$table<-renderTable(data$data)

    return(reactive(data$data))
      })

}

##rendering the values from the filtering column in the module's UI
cylServer <- function(id, carb_data) {
  
  moduleServer(id, function(input, output, session) {
    
    ns<-session$ns
    
    output$cyl<-renderUI({
      
      selectInput(
              ns("cyl"), 
              "Cyl", 
              choices = carb_data()$cyl)
      
      
    })
    
    return(reactive(input$cyl))
    
  })
}

##attempting to filter based on the user's selection of the rendered UI element
new_tableServer <- function(id, .cyl) {

  moduleServer(id, function(input, output, session) {

    ns<-session$ns

    data<-reactiveValues(data = NULL)

    observe(data$data<-mtcars%>%filter(cyl == .cyl()))

    output$table_output<-renderTable(data$data)
    
    # output$cyl_text<-renderText(.cyl())

    })

}
#Reprex App

ui <- page(
  
    testUI("x1")

    )


server <- function(input, output) {

carb<-fetchServer("x1")
data<-testServer("x1", carb)
cyl<-cylServer("x1", data) 
new_tableServer("x1", cyl)
}


shinyApp(ui = ui, server = server)
r shiny module
1个回答
0
投票

您可以为每个服务器模块定义一个

ui
,然后为每个模块调用提供唯一的 ID。试试这个

#Reprex modules

library(shiny)
library(bslib)
library(DT)
library(tidyverse)
library(dplyr)

fetchUI<-function(id){
  
  ns<-NS(id)
  tagList(
    selectInput(ns("carb"), "Carb", choices = sort(unique(mtcars$carb)), selected = 4)
                   #uiOutput(ns("cyl"))
  )
  
}

###initial filter function in UI to make dynamic dummy dataframe
fetchServer <- function(id) {
  
  moduleServer(id, function(input, output, session) {
    
    ns<-session$ns
    
    return(reactive(input$carb))
    
  })
}

testUI<-function(id){
  
  ns<-NS(id)
  tagList(
    DTOutput(ns("table"))
  )
  
}

##the initial data frame where the filtering column is located
testServer <- function(id, carb) {
  
  moduleServer(id, function(input, output, session) {
    
    ns<-session$ns
    
    df<-reactiveValues(data = NULL)
    
    observe({
      if (!is.null(carb()))
        df$data<-mtcars%>% dplyr::filter(carb %in% req(carb()))
    })
    
    output$table<-renderDT(df$data)
    
    return(reactive(df$data))
  })
  
}


cylUI<-function(id){
  
  ns<-NS(id)
  tagList(
    uiOutput(ns("cyl"))
  )
  
}

##rendering the values from the filtering column in the module's UI
cylServer <- function(id, carb_data) {
  
  moduleServer(id, function(input, output, session) {
    
    ns<-session$ns
    
    output$cyl<-renderUI({
      req(carb_data())
      selectInput(
        ns("cyl"), 
        "Cyl", 
        choices = unique(carb_data()$cyl), selected=carb_data()$cyl[1] )
    })
    return(reactive(input$cyl))
    
  })
}


newUI<-function(id){
  
  ns<-NS(id)
  tagList(
    DTOutput(ns("table2"))
  )
  
}
##attempting to filter based on the user's selection of the rendered UI element
new_tableServer <- function(id, cyl) {
  
  moduleServer(id, function(input, output, session) {
    
    ns<-session$ns
    
    dat<-reactiveValues(data = NULL)
    
    observe({
      if (!is.null(cyl())) dat$data<-mtcars%>% dplyr::filter(cyl %in% req(cyl()))
    })
    
    output$table2 <- renderDT({datatable(req(dat$data))})
    
    # output$cyl_text<-renderText(.cyl())
    
  })
  
}


ui <- page(
  
  fetchUI("x1"),
  testUI("x2"),
  cylUI("x3"),
  newUI("x4")
)

server <- function(input, output, session) {
  carb<-fetchServer("x1")
  data<-testServer("x2", carb)
  cyl<-cylServer("x3", data)
  new_tableServer("x4", cyl)
}

shinyApp(ui = ui, server = server)
© www.soinside.com 2019 - 2024. All rights reserved.