我正在尝试构建一个简单的闪亮应用程序,该应用程序将以下结构的数据框作为输入:
A B C D E F G Y
1 1 1 x x x x
1 2 1 x x
1 2 2 x x x
1 2 2 x x x
2 1 1 x x x
我希望能够根据作为复选框给出的列(D,E,F,G和Y)的值来过滤R Shiny中的数据。复选框通过以下方式分组:
Category1 Checkboxes (D, E)
Category2 Checkboxes (F, G, Y)
我实现的一个解决方案是对子集(保留相应的类别列)并将该表转换为长格式,并基于key,value
对进行过滤。但是,我正在寻找无需进行转换的解决方案。
有人可以指导我如何实现这一目标吗?
以下是可复制的数据:
dput(test)
structure(list(A = c(1L, 1L, 1L, 1L, 2L), B = c(1L, 2L, 2L, 2L,
1L), C = c(1L, 1L, 2L, 2L, 1L), D = structure(c(2L, 2L, 1L, 2L,
2L), .Label = c("", "x"), class = "factor"), E = structure(c(2L,
1L, 2L, 2L, 1L), .Label = c("", "x"), class = "factor"), F = structure(c(2L,
1L, 2L, 2L, 2L), .Label = c("", "x"), class = "factor"), G = structure(c(2L,
1L, 1L, 1L, 1L), .Label = c("", "x"), class = "factor"), Y = structure(c(2L,
1L, 2L, 1L, 1L), .Label = c("", "x"), class = "factor")), .Names = c("A",
"B", "C", "D", "E", "F", "G", "Y"), class = "data.frame", row.names = c(NA,
-5L))
空白仅是NA
,这意味着在过滤中不应考虑该列仅包含NA
的行。
按以下示例对复选框进行分组:
类别1(D
和E
)表示在此类别中,可以选择D
或E
,或两者都选择。
当我选中E
框时,只有E
包含x
的行才应保留在过滤后的输出中。
如果我选中另一个框,例如G
,则行列表将减少为E
和G
包含x
的行
我希望这可以更好地阐明问题。
这是我的代码:
ui.R
library(shiny)
library(shinythemes)
library(shiny)
library(shinydashboard)
library(shinycssloaders)
library(plotly)
dashboardPage(skin="blue", dashboardHeader(title = "test"),
dashboardSidebar(
sidebarMenu(
menuItem("Export Page", tabName = "main", icon = icon("dashboard"))
)
),
dashboardBody(
tags$head(
tags$link(rel = "stylesheet", type = "text/css", href = "custom.css")
),
#tags$head(tags$link(rel = "icon", type = "image/png", href = "favicon.png"), tags$title("LinkAnalysis")),
tabItems(
tabItem(tabName = "main",
sidebarPanel(
fluidPage(
uiOutput("checkboxes_cat1"),
uiOutput("checkboxes_cat2")
)
),
mainPanel(
tableOutput("table")
)
)
)
)
)
server.R
library(shiny)
library(shinythemes)
library(ggplot2)
library(dplyr)
test <- read.table('test.csv', sep=';', header = T)
shinyServer(function(input, output) {
output$checkboxes_cat1 <- renderUI({
return(checkboxGroupInput("cat1", "Category 1", choices = levels(as.factor(colnames(test[4:5])))))
})
output$checkboxes_cat2 <- renderUI({
return(checkboxGroupInput("cat2", "Category 2", choices = levels(as.factor(colnames(test[5:7])))))
})
filtered<-reactive({
#d <- test[,input$cat1,drop=FALSE]
#d
#### the filtering should be done here
test
})
output$table<-renderTable({
filtered()
})
})