恐惧表现和shinnyapp

时间:2015-10-14 09:32:16

标签: fread shiny

我有一个闪亮的应用程序,必须读取客户端提供的大表并执行一些计算。 出于这个原因,我在以下函数中使用了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) 

1 个答案:

答案 0 :(得分:1)

我在我的闪亮应用程序中使用data.tables和fread,但我没有看到你指出的性能损失。

由于您没有提供可重复的示例,我将根据我的经验进行评论。

  • fread是data.table库的一部分,它的输出是data.table(如果你想要data.frame输出,你可以在函数调用中设置适当的选项 等)。
  • 使用大桌子的努力是尽量减少R服用的机会 你的表的副本:除非绝对必要,否则我会避免使用函数,但我会在你正在使用的闪亮函数中进行任何操作 在那一刻。
  • 同样,我只会 删除:=运算符的列。 遗憾的是,如果您需要删除行,:=运算符尚不可用,您需要复制,但[运算符应该比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))