在R Shiny

时间:2018-07-03 14:34:36

标签: r shiny

我正在尝试构建一个简单的闪亮应用程序,该应用程序将以下结构的数据框作为输入:

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(DE)表示在此类别中,可以选择DE,或两者都选择。

当我选中E框时,只有E包含x的行才应保留在过滤后的输出中。

如果我选中另一个框,例如G,则行列表将减少为EG包含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()

    })

})

0 个答案:

没有答案