我有一个闪亮的应用程序,必须读取客户端提供的大表并执行一些计算。 出于这个原因,我在以下函数中使用了fread
read_shiny_files=function(path){
file = data.table::fread(path,stringsAsFactors = F,header=TRUE,data.table=FALSE,skip=0)
rownames(file)=make.names(samples(file[,1]),unique=TRUE)
file=file[,-1]
return(file)
}
然后我允许基于用户参数进行一些数据预处理
read_files=function(features_list,rm,rmv,im,imv,nr){
features_list=lapply(features_list,read_shiny_files)
#remove rows and columns with more than rmv missing values
if(rm==TRUE) features_list=lapply(features_list,remove_missing,rmv)
#impute based on imv neighbours. Method based on Troyanskaya et al
if(im==TRUE) features_list=lapply(features_list,function(x,imv) t(impute.knn(t(x),k=imv)$data),imv)
if(nr==TRUE) features_list=lapply(features_list,standardNormalization)
return(features_list)
}
在RStudio中运行此功能以获得20M的表不会超过2秒 但是Shiny需要花费更多的时间(差不多一分钟)。无论是使用RunApp在本地运行还是在shinyapp.io Web应用程序上使用它,都会发生这种情况 你能帮助我提高速度吗?
这是我写的
> fl=reactive({
> validate(
> need(input$files$datapath != "", "Please select a data set")
> ) read_files(features_list=input$files$datapath,input$rm,input$rmv,input$im,input$imv,input$nr)
> })
PS
我还更改了server.R中的参数以更改表格最大值(限制为5M)
options(shiny.maxRequestSize=100*1024^2)
答案 0 :(得分:1)
我在我的闪亮应用程序中使用data.tables和fread,但我没有看到你指出的性能损失。
由于您没有提供可重复的示例,我将根据我的经验进行评论。
:=
运算符的列。
遗憾的是,如果您需要删除行,:=
运算符尚不可用,您需要复制,但[
运算符应该比lapply更快。总之,我会对data.table进行动态构建data.table表达式的所有操作(Matt Doyle建议的很好的技术)。
这是我的代码中的一个例子:
str <- paste0("cal_[dtf_,allow.cartesian=TRUE][, ftehours := sum(fteSum),by=c('", appTime_,
"', 'subfunctionname')]")
dtf_ <- eval(parse(text= str))