Как сделать R рендеринг участков быстрее

Мы используем R, чтобы выплескивать графики (тепловые карты), которые отображаются на блестящем приложении (веб-странице). В настоящее время мы сталкиваемся с проблемой со временем, когда требуется R, чтобы сделать график, занимающий время, необходимое для вычисления. Позвольте мне показать то же самое на надуманном примере. В этом базовом тестовом случае R занимает ~ 17 секунд для рендеринга и сохранения файла тепловой карты в виде png (время компьютерного времени выведено: кластеры строк и столбцов предварительно вычисляются)

Мне интересно, есть ли способ сократить время, затрачиваемое на то, чтобы сделать этот тип графика значительным фактором. Возможно, мне не хватает каких-либо других постоянных вычислений, которые также могут быть сняты с функции heatmap.

Спасибо!

генерировать данные

m1 <- matrix(rnorm(500000,mean=15,sd=4),ncol=100)
m2 <- matrix(rnorm(500000,mean=30,sd=3),ncol=100)
m <- cbind(m1,m2)
dim(m)

базовая карта тепла со всеми вычислениями

png('test_heatmap.png')
system.time(heatmap(m))

user  system elapsed 
29.327   0.637  30.526 

выполняют кластеризацию из функции тепловой карты: в основном для проверки времени отображения графика

> system.time(hcr <- hclust(dist(m)))
   user  system elapsed 
  9.992   0.126  10.144 
> system.time(hcc <- hclust(dist(t(m))))
   user  system elapsed 
  0.659   0.002   0.662 
> system.time(ddr <- as.dendrogram(hcr))
   user  system elapsed 
  0.498   0.010   0.508 
> system.time(ddc <- as.dendrogram(hcc))
   user  system elapsed 
  0.011   0.000   0.011 

время рендеринга тепловой карты с предварительно вычисленной дендрограммой строк/столбцов

png('test_heatmap.png')
> system.time(heatmap(m,Rowv=ddr,Colv=ddc))
   user  system elapsed 
 16.128   0.558  17.171 

Ответы

Ответ 1

geom_raster(), из пакета ggplot2, обеспечивает высокопроизводительный тайлинг. Это может ускорить визуализацию тепловой карты, как только кластеризация будет выполнена.

Ответ 2

Еще одна вещь, которую стоит рассмотреть:

library(lattice)
levelplot(hclust(dist(m)))