首页 > 解决方案 > 提高此脚本的性能

问题描述

这是我在 R 闪亮应用程序中介绍的一段代码,但这需要我很多时间,因为我在一个反应​​函数中执行它,然后我为不同的图形调用五次。

您有提高此脚本速度的想法吗?

我已经尝试使用 purr 来执行此操作,但我对这个工具的掌握不够好。

这是一个可重现的示例

library(profvis)
profvis({

#dataframe created for the example

DF<- data.frame("scan"=seq(1:7518),"dye1"=NA,"dye2"=NA,"dye3"=NA,"dye4"=NA,"dye5"=NA,"dye6"=NA)
DF$dye1 <- sample(100, size = nrow(DF), replace = TRUE)
DF$dye2 <- sample(100, size = nrow(DF), replace = TRUE)
DF$dye3 <- sample(100, size = nrow(DF), replace = TRUE)
DF$dye4 <- sample(100, size = nrow(DF), replace = TRUE)
DF$dye5 <- sample(100, size = nrow(DF), replace = TRUE)
DF$dye6 <- sample(100, size = nrow(DF), replace = TRUE)


#slowness begins here

for (d in 3000:7518){

  #array of input data
  input <- numeric(1206)

  for (i in -100:100){
    input[1+i+100] <- DF$dye1[d + i]
    input[202+i+100] <- DF$dye2[d + i]
    input[403+i+100] <- DF$dye3[d + i]
    input[604+i+100] <- DF$dye4[d + i]
    input[805+i+100] <- DF$dye5[d + i]
    input[1006+i+100] <- DF$dye6[d + i]
  }
}
})

标签: rperformancefor-loopshiny

解决方案


首先:请真正重新考虑您想要实现的目标以及这种方法是否是实现它的最聪明的方法。

第二:使用矢量化来提高你的性能:

d <- 3000
input <- numeric(1206)

microbenchmark::microbenchmark(
  # loop as before
  case1 = {for (i in -100:100){
    input[1+i+100] <- DF$dye1[d + i]
  }},
  # use vectorization
  case2 = {input[(1-100+100):(1+100+100)] <- DF$dye1[(d -100):(d +100)]}
)

推荐阅读