我目前正在尝试创建一个应用程序,该应用程序接收大型数据帧,然后根据上传的数据帧中的列进行过滤,然后再为用户显示表格。当我尝试根据相关输入的值进行过滤时,收到一条错误消息,指出过滤器值必须是“[数据帧的大小] 或 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)
您可以为每个服务器模块定义一个
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)