Я пытаюсь создать простое блестящее приложение, которое принимает в качестве входных данных фрейм данных в следующей структуре:
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
Я бы хотел иметь возможность фильтровать данные в R блестящие на основе значений столбцов (D, E, F, G и Y), заданных в качестве флажков. Флажки сгруппированы следующим образом:
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()
})
})