Избегайте множественных вызовов функций в сервере shiny

#r #function #shiny

#r #функция #блестящий

Вопрос:

У меня есть следующий код в серверной функции приложения shiny.

Для построения диаграмм каждого типа мне нужно каждый раз вызывать функцию getPlotData() . Есть ли какой-либо способ избежать этого, чтобы ускорить работу приложения?

функция

  #This gets Sales data for selected client data
  getPlotData <- reactive({

    inpParam <<- input$noc 
    getSalesData(inpParam)
    End_date <<- input$endDate    

    SalesClientData <<- GetSalesClientData()
    WeeklySales <<- GetWeeklyData()
    FortNightData <<- GetFortNightlyData()
    EWS <<- GetEWSData()
    MONTHLYSALES <<- GetMonthlyData()
    wtSafetyRatio <<- round(as.numeric(crossprod(MONTHLYSALES$SafetyRatio,MONTHLYSALES$Weights)/sum(MONTHLYSALES$Weights)),2)
    wtHealthScore <<- round(as.numeric(crossprod(MONTHLYSALES$HealthScore,MONTHLYSALES$Weights)/sum(MONTHLYSALES$Weights)),2)
    wtPaymentScore <<- round(as.numeric(crossprod(MONTHLYSALES$PaymentScore,MONTHLYSALES$Weights)/sum(MONTHLYSALES$Weights)),2)
    ROLLDATA <<- GetRollingData()
    EARLY_TOPUP <<- GetEarlyTopUp()

  })

  #DPD Plots
  output$DPDPLot<-renderPlotly({

    getPlotData()

    plot_ly(data=SalesClientData, x = ~Date, y = ~DPD, name='DPD', type='scatter', mode = 'lines') %>%
      add_trace(y = ~CHECKNACHDPD, name = 'CHEQUE-NACH Payment', type='bar') %>% 
      add_trace(y = ~CHKNACHBounceDPD, name = 'CHEQUE-NACH Bounce', type='bar') %>% 
      layout(title= "DPD Pattern", legend = list(orientation = "h"))

  })

  #Sales Plot
  output$SalesPlot<-renderPlotly({

    getPlotData()

    SalesDayWise = group_by(SalesClientData,Day)
    SalesDayWise = summarize(SalesDayWise,TotalSales = sum(TotalPayRecvdAdj, na.rm=TRUE))

    plot_ly(data=SalesDayWise, x = ~Day, y = ~TotalSales, name='Total Sales', type='bar') %>%
      layout(title="Daywise Sales", legend = list(orientation = "h"))

  })
  

Комментарии:

1. Я думаю, вы reactive неправильно используете выражение. Пожалуйста, ознакомьтесь с руководством здесь .

Ответ №1:

Я думаю, у вас сложилось ошибочное впечатление, что только потому, что вы снова вызываете функцию, она вычисляет каждый раз, когда она вызывается. Но на самом деле это вычисляется только один раз, когда изменяются входные виджеты в реактивном выражении.

Вы можете проверить это, поместив оператор print в функцию GetSalesClientData() или любую другую функцию в это реактивное выражение.

Даже если вы вызовете реактивное выражение 100 раз, оно будет вычислять и получать новые результаты только в том случае, если входные виджеты, включенные в реактивное выражение, изменятся.

В данном случае это input$noc и input$endDate