【发布时间】:2015-06-02 13:35:21
【问题描述】:
我的应用程序可以很好地处理反应式表达式,但速度很慢。 我有两个功能:
FixData 清理和修复我的数据(超过 50 万行),这个功能很慢
PlotData,它返回一个 ggplot 图并且相当快
我首先要做的是导入我的文件并在不使用“reactive({})”的情况下修复我的数据,例如我的数据将被命名为“mydata”。 其次,我用反应式表达式过滤和表示“my.data”。 我想要的是把我的数据保存在内存中,不要像我现在的程序那样改变它。
shinyServer(function(input, output) {
# observe({
cp <- reactive({
inFile <- input$file1
if (is.null(inFile))
return(NULL)
read.delim(inFile$datapath, header = TRUE,
sep = "\t",stringsAsFactors=FALSE)
})
up <- reactive({
inFile <- input$file2
if (is.null(inFile))
return(NULL)
read.delim(inFile$datapath, header = TRUE,
sep = "\t",stringsAsFactors=FALSE)
})
tac <- reactive({
inFile <- input$file3
if (is.null(inFile))
return(NULL)
read.delim(inFile$datapath, header = TRUE,
sep = "\t",stringsAsFactors=FALSE)
})
GetData <- reactive({
my.data <- FixData(data.cp = cp(), data.up = up(), data.tac = tac())
ifelse(input$case1 == TRUE & input$case2 == FALSE,
my.data <- my.data[my.data$CONSTRUCTEUR %in% manufacturer &
my.data$TYPE_DE_TERMINAL %in% input$terminal.type, ],
ifelse(input$case2 == TRUE & input$case1 == FALSE,
my.data <- my.data[my.data$TYPE_DE_TERMINAL %in% terminal &
my.data$CONSTRUCTEUR %in% input$manufacturer, ],
ifelse(input$case1 == TRUE & input$case2 == TRUE,
my.data <- my.data[my.data$CONSTRUCTEUR %in% manufacturer &
my.data$TYPE_DE_TERMINAL %in% terminal, ],
my.data <- my.data[my.data$CONSTRUCTEUR %in% input$manufacturer &
my.data$TYPE_DE_TERMINAL %in% input$terminal.type, ]
)))
if(input$lte == TRUE){
my.data <- my.data[my.data$LTE == "Oui", ]
}
ifelse(input$case3 == TRUE,
my.data <- my.data[my.data$Cause %in% cause, ],
my.data <- my.data[my.data$Cause %in% input$pb, ]
)
my.data
})
GetData2 <- reactive({
if (input$compare == "yes"){
cp2 <- reactive({
inFile <- input$file4
if (is.null(inFile))
return(NULL)
read.delim(inFile$datapath, header = TRUE,
sep = "\t",stringsAsFactors=FALSE)
})
up2 <- reactive({
inFile <- input$file5
if (is.null(inFile))
return(NULL)
read.delim(inFile$datapath, header = TRUE,
sep = "\t",stringsAsFactors=FALSE)
})
my.data <- FixData(data.cp = cp2(), data.up = up2(), data.tac = tac())
ifelse(input$case1 == TRUE & input$case2 == FALSE,
my.data <- my.data[my.data$CONSTRUCTEUR %in% manufacturer &
my.data$TYPE_DE_TERMINAL %in% input$terminal.type, ],
ifelse(input$case2 == TRUE & input$case1 == FALSE,
my.data <- my.data[my.data$TYPE_DE_TERMINAL %in% terminal &
my.data$CONSTRUCTEUR %in% input$manufacturer, ],
ifelse(input$case1 == TRUE & input$case2 == TRUE,
my.data <- my.data[my.data$CONSTRUCTEUR %in% manufacturer &
my.data$TYPE_DE_TERMINAL %in% terminal, ],
my.data <- my.data[my.data$CONSTRUCTEUR %in% input$manufacturer &
my.data$TYPE_DE_TERMINAL %in% input$terminal.type, ]
)))
if(input$lte == TRUE){
my.data <- my.data[my.data$LTE == "Oui", ]
}
ifelse(input$case3 == TRUE,
my.data <- my.data[my.data$Cause %in% cause, ],
my.data <- my.data[my.data$Cause %in% input$pb, ]
)
my.data
}
})
observe({
if(input$compare == "no"){
output$myChart1 <- renderPlot({
my.plot <- PlotDataManBis(GetData(),
var = input$variable)
my.plot
})
output$myChart2 <- renderPlot({
my.plot <- PlotDataTypeBis(GetData(),
var = input$variable)
my.plot
})
output$myChart3 <- renderPlot({
my.plot <- PlotDataCauseBis(GetData(),
var = input$variable)
my.plot
})
output$resume <- renderDataTable({
my.data2 <- GetData()
my.data2
},
options = list(bSortClasses = TRUE, iDisplayLength = 10,
aLengthMenu = list(c(5, 10, -1), c('5', '10', 'All'),
aoColumnDefs = list(list(sWidth=c("100px"),
aTargets=list(0)))
))
)
}else{
output$myChart1 <- renderPlot({
my.plot <- PlotDataMan(GetData(), GetData2(),
var = input$variable)
my.plot
})
output$myChart2 <- renderPlot({
my.plot <- PlotDataType(GetData(), GetData2(),
var = input$variable)
my.plot
})
output$myChart3 <- renderPlot({
my.plot <- PlotDataCause(GetData(), GetData2(),
var = input$variable)
my.plot
})
output$resume <- renderDataTable({
my.data2 <- GetData()
my.data2
},
options = list(bSortClasses = TRUE, iDisplayLength = 10,
aLengthMenu = list(c(5, 10, -1), c('5', '10', 'All'),
aoColumnDefs = list(list(sWidth=c("100px"),
aTargets=list(0)))
))
)}})
# })
})
谢谢, 莫斯
【问题讨论】:
-
您只需执行
df <- read.delim("some file")并在整个应用程序中访问它。你不需要把它放在响应式中。 -
你能更明确一点吗,因为我必须为 ui.r 界面保留 infile ?我很不安,我总是使用反应式表达......谢谢
-
据我所知,如果必须使用“输入”变量,则必须在反应式上下文中完成。