R闪亮的操纵数据表

  • 本文关键字:操纵 数据表 r shiny
  • 更新时间 :
  • 英文 :


我想首先上传一个CSV文件,然后根据侧面板中选择的内容来操作数据表的显示方式。这是我的CSV数据示例:

学生数据表

工作原理是,我首先选择我的部门:如果我是校长,整个数据表都会打印出来。如果我是老师,我只能看到SubmissionDate、StudentID和Class。如果我是学生,我只能看到SubmissionDate、StudentID和Student。

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

我的问题是:1.我的数据表显然无法运行。是因为使用fread吗?我得到了这个错误:"警告:.getReactiveEnvironment(($currentContext:在没有活动的反应上下文的情况下不允许操作。(你试图做一些只能从反应表达式或观察者内部完成的事情。(">

  1. 如何从多个输入中筛选数据表

这是我的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本身(,但如果您想朝着这个方向前进,上面的示例应该会让您开始。

最新更新