r - 提高此脚本的性能
问题描述
这是我在 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]
}
}
})
解决方案
首先:请真正重新考虑您想要实现的目标以及这种方法是否是实现它的最聪明的方法。
第二:使用矢量化来提高你的性能:
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)]}
)
推荐阅读
- azure-devops - 在 Azure DevOps 管道中强制提交输入
- javascript - 在扩展样式组件上使用“as”样式组件道具时丢失组件道具
- python - 如何将 CSV 数据转换为邻接矩阵以进行层次聚类?
- flutter - 有没有办法对小部件进行有条件的重建
- javascript - 传递目录列表以获取具有 TODO 关键字(例如 //TODO)但不作为变量/字符串的文件列表时 TODO 关键字的正则表达式
- java - 如何将数据作为表单数据添加到 POST 请求正文
- c++ - ui_ 类中的 QT 相对路径问题
- python - Python - 使用列表将数据插入到 Word 文档中
- mysql - 实体框架级联不删除子级但设置为空
- common-lisp - 如何将双引号符号转换为字符串