R闪亮的操作数据表

时间:2018-11-03 16:48:10

标签: r shiny

我想先上传CSV文件,然后根据侧面板中选择的内容来操纵如何显示数据表。这是我的CSV数据示例:

Students Data Table

这是如何工作的,我首先选择我的部门:如果我是校长,则会打印整个数据表。如果我是老师,则只能看到SubmissionDate,StudentID和班级。如果我是学生,则只能看到SubmissionDate,StudentID和Student。

此外,我打算按SubmissionDate进行过滤。无论我是谁,如果我选择日期范围,则只会显示日期范围内的那些行。例如,如果我是A03 Sam,如果我没有选择日期范围,则会看到2行。如果我选择了一年的日期范围,则只会看到1行。

我的问题是: 1.我的数据表显然无法运行。是因为使用fread吗?我收到此错误:“警告:.getReactiveEnvironment()$ currentContext中的错误:没有活动的反应性上下文,不允许进行操作。(您试图做只能从反应性表达式或观察者内部完成的操作。)

  1. 如何从多个输入中过滤数据表?

这是我的R Shiny代码:

ui <- fluidPage(
  titlePanel("Students"), 
  sidebarLayout( 
    sidebarPanel(
      fileInput("file1", 
                "Choose CSV File", 
                multiple=TRUE, 
                accept=c( "text/csv", "text/comma-separated-values,text/plain", ".csv")), 
      checkboxInput("header", "Header", TRUE),
      radioButtons("disp", "Display", choices=c(Head="head" , All="all" ), selected="head"), 
      
      tags$hr(), 
      radioButtons("dept", 
                   "Department", 
                   choices=c(Principal="Principal" , Teacher="Teacher" , Student="Student"
      dateRangeInput("dates", "Date Range"), 
      textInput("studentid",
                "StudentID", 
                value="Enter StudentID:" )
) ), 
                         
  mainPanel(tableOutput("contents") ) ) )
  
library(shiny) 
library(data.table) 
server <- function(input,output) { 
  data <- fread(input$file1$datapath, 
                header=input$header, 
                sep=",", 
                quote='"') 
  
  output$contents <- renderDataTable( 
  if(input$disp=="head" ){return(data))} 
  else {return(data)}
  ) 
} 
  
shinyApp(ui, server)

非常感谢您!

1 个答案:

答案 0 :(得分:0)

您需要正确设置所有reactive组件。

此外,如果您希望适当地过滤数据,则需要在server中进行操作。

以下是基于您的示例的有效脚本:

library(shiny) 
library(data.table)
library(dplyr)

ui <- fluidPage(
  titlePanel("Students"), 
  sidebarLayout( 
    sidebarPanel(
      fileInput("file1", 
                "Choose CSV File", 
                multiple=TRUE, 
                accept=c( "text/csv", "text/comma-separated-values,text/plain", ".csv")), 
      checkboxInput("header", "Header", TRUE),
      radioButtons("disp", "Display", choices=c(Head="head" , All="all" ), selected="head"), 

      tags$hr(), 
      radioButtons("dept", 
                   "Department", 
                   choices=c(Principal="Principal" , Teacher="Teacher" , Student= "Student")),
      dateRangeInput("dates", "Date Range"), 
      textInput("studentid", "StudentID", value="Enter StudentID:" )
    ),
    mainPanel(DT::dataTableOutput("contents"))
  )
)


server <- function(input,output) { 

  file <- reactive({

    if (input$header) {

      return(fread(input$file1$datapath, 
                   header= TRUE, 
                   sep=",", 
                   quote='"'))

    } else {

      return(fread(input$file1$datapath, 
                   header= FALSE, 
                   sep=",", 
                   quote='"'))
    }

  })

  file_head <- reactive({

    if(input$disp == "head") {

      return(head(file()))

    } else { return(file()) }

  })

  data_filtered <- reactive({

    if (input$dept == "Teacher") {

      return(file_head() %>% mutate_at(.vars = 1, funs(as.Date(strptime(., format = "%Y%m%d")))) %>%
        select_at(.vars = c(1:2, 4)) %>%
        filter_at(.vars = 1, any_vars(. >= input$dates[1] & . <= input$dates[2])))

    }

    else if (input$dept == "Student") {

      return(file_head() %>% mutate_at(.vars = 1, funs(as.Date(strptime(., format = "%Y%m%d")))) %>%
        select_at(.vars = c(1:3)) %>%
        filter_at(.vars = 1, any_vars(. >= input$dates[1] & . <= input$dates[2])))

    }

    else { 

      return(file_head() %>% mutate_at(.vars = 1, funs(as.Date(strptime(., format = "%Y%m%d")))) %>%
        filter_at(.vars = 1, any_vars(. >= input$dates[1] & . <= input$dates[2])))

    }

  })


  output$contents <- DT::renderDataTable({

    if (is.null(input$file1)) {

      return(NULL) } else { return(data_filtered() ) }

  })

}

shinyApp(ui, server)

我已经看到您也希望输入Student ID的文本。

由于您尚未对此指定任何内容,因此我没有将其包含为过滤器(您始终可以使用Search过滤DT本身),但是如果您愿意,上面的示例应该可以帮助您入门朝那个方向前进。