我想先上传CSV文件,然后根据侧面板中选择的内容来操纵如何显示数据表。这是我的CSV数据示例:
这是如何工作的,我首先选择我的部门:如果我是校长,则会打印整个数据表。如果我是老师,则只能看到SubmissionDate,StudentID和班级。如果我是学生,则只能看到SubmissionDate,StudentID和Student。
此外,我打算按SubmissionDate进行过滤。无论我是谁,如果我选择日期范围,则只会显示日期范围内的那些行。例如,如果我是A03 Sam,如果我没有选择日期范围,则会看到2行。如果我选择了一年的日期范围,则只会看到1行。
我的问题是: 1.我的数据表显然无法运行。是因为使用fread吗?我收到此错误:“警告:.getReactiveEnvironment()$ currentContext中的错误:没有活动的反应性上下文,不允许进行操作。(您试图做只能从反应性表达式或观察者内部完成的操作。)
这是我的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)
非常感谢您!
答案 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本身),但是如果您愿意,上面的示例应该可以帮助您入门朝那个方向前进。