Проблема производительности в Shiny при отображении сюжетно-объекта - PullRequest
0 голосов
/ 04 июля 2019

Я использую эту функцию для создания сюжетного объекта:

aligned_plot <- function(a_data, mapping, col_vector, col_label) {
  color <- NULL
  x_aes <- "rank"
  y_aes <- "case_rank"  

  Max_Dim <- max(a_data$case_rank)
  Max_Rank <- max(a_data$rank)
  Max_Case_Rank <- max(a_data$case_rank)  

  a_data %>%
    ggplot(aes_string(x = x_aes, y = y_aes)) +
    scale_x_discrete(drop = FALSE) + scale_y_discrete(drop = FALSE) +
    labs(x = "Activitys", y = "Traces") +
    theme_light()-> p

  if (Max_Dim > 400)
    p + geom_point(aes(color  = Activity)) + scale_color_manual(name =     col_label, values = col_vector) -> p
  else {
    p + geom_raster(aes(fill  = Activity)) +
      geom_vline(xintercept   = seq(.5, Max_Rank, by = 1), color = "gray90") +
      geom_hline(yintercept   = seq(.5, Max_Case_Rank, by = 1), color = "gray90") +
      scale_color_manual(name = col_label, values = col_vector) -> p
  }
  return(p)
}

При интерактивном вызове этой функции в RStudio для создания графика требуется 0,43 секунды.

Эта функция используется на Shinydashboard:

  output$Aligned_Chart        <- renderUI({
    addSpinner(plotlyOutput(ns("Aligned_Chart_Plotly"), height = 700),  spin = "fading-circle", color = Spinner_Kleur)
  })
  output$Aligned_Chart_Plotly <- renderPlotly({
    P_data <- rv$Doorloop_events
    P_Map  <- mapping(P_data)
    P_data %>%  aligned_data() %>% .$In_Scope %>% 
      aligned_plot(P_Map, col_vector(),
             activity_id(P_data)) %>%
      ggplotly()
  })

Теперь для выполнения aligned_plot() требуется примерно 2:20 минут. Кто-нибудь может объяснить, что вызывает эту задержку? (Max_Dim является вспомогательной переменной со значением 130, поэтому aligned_plot() создает geom_raster)

Ben

После выяснения, как добавить Spinner, я мог пропустить вывод $ Aligned_Chart. Но на создание диаграммы все равно уходит около 2 минут, поэтому я решил использовать renderPlot:

output$Aligned_Chart_Plot <- renderPlot({
  P_data <- rv_mod$Doorloop_events
  P_Act  <- activity_id(rv_mod$Doorloop_events)
  P_Map  <- mapping(P_data)
  P_data %>% aligned_data() %>% .$In_Scope -> P_data
  A_Plot <- aligned_plot(P_data, P_Map, col_vector(), P_Act)
  A_Plot
})  

aligned_data() использует boxplot() для обнаружения выбросов, и блок-график по умолчанию возвращает график. Вместо того, чтобы возвращать geom_raster, renderPlot() визуализировал коробочный график. Это было исправлено заменой boxplot() на UnivariateOutlierDetection(). Теперь рендеринг моего сюжета занимает 4 секунды.
Однако при рендеринге с использованием графика, все равно требуется 1 минута для рендеринга объекта, созданного ggplotly().

Это нормально, что сюжет занимает так много времени?

...