#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