我想首先上传一个CSV文件,然后根据侧面板中选择的内容来操作数据表的显示方式。这是我的CSV数据示例:
学生数据表
工作原理是,我首先选择我的部门:如果我是校长,整个数据表都会打印出来。如果我是老师,我只能看到SubmissionDate、StudentID和Class。如果我是学生,我只能看到SubmissionDate、StudentID和Student。
此外,我打算按SubmissionDate进行筛选。无论我是谁,如果我选择一个日期范围,将只显示日期范围内的那些行。例如,如果我是A03 Sam,如果我没有选择日期范围,我将看到2行。如果我选择了一年的日期范围,我将只看到1行。
我的问题是:1.我的数据表显然无法运行。是因为使用fread吗?我得到了这个错误:"警告:.getReactiveEnvironment(($currentContext:在没有活动的反应上下文的情况下不允许操作。(你试图做一些只能从反应表达式或观察者内部完成的事情。(">
- 如何从多个输入中筛选数据表
这是我的R闪亮代码:
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)
非常感谢!
您需要正确设置所有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本身(,但如果您想朝着这个方向前进,上面的示例应该会让您开始。