r - shinyapp.io 应用程序的性能不如本地闪亮应用程序
问题描述
下面是我的实际应用程序的简化版本,但它捕获了我遇到的问题。当我在本地运行应用程序时,我没有任何问题:绘图在应用程序启动时加载并且仅在按下操作按钮时更新。日期范围输入也如我所料动态更新。
问题:当我运行部署的应用程序https://notsospecial.shinyapps.io/shinyTest/时,它没有按预期工作:
Chrome:启动时不加载绘图。单击“提交”后,所有图都“变灰”
Firefox:情节在启动时加载。单击“提交”后,所有图都“变灰”
我该如何解决?谢谢!
library(shiny); library(tidyverse); library(tidyquant); library(formattable); library(lubridate);
#create data
shinyData <- expand.grid(date = seq.Date(as.Date("2019-03-01"),Sys.Date(),by="days"),SITEID = LETTERS[1:2]) %>%
mutate(
mon.day = format(date,"%B-%d"),
month = month(date,label = T,abbr=T),
year = as.factor(year(date)))
set.seed(1)
shinyData$Customers[shinyData$year==2019&shinyData$SITEID=="A"] = rnorm(nrow(shinyData[shinyData$year==2019&shinyData$SITEID=="A",]),50,7)
shinyData$Customers[shinyData$year==2019&shinyData$SITEID=="B"] = rnorm(nrow(shinyData[shinyData$year==2019&shinyData$SITEID=="B",]),200,17)
shinyData$Customers[shinyData$year==2020&shinyData$SITEID=="A"] = rnorm(nrow(shinyData[shinyData$year==2020&shinyData$SITEID=="A",]),35,10)
shinyData$Customers[shinyData$year==2020&shinyData$SITEID=="B"] = rnorm(nrow(shinyData[shinyData$year==2020&shinyData$SITEID=="B",]),100,12)
shinyData$Charges = shinyData$Customers*rnorm(nrow(shinyData),50,10)
#date range start and end
dateRangMax <- max(shinyData$date,na.rm=T)-1
dateRangMin <-dateRangMax-15
altEndDate= as.Date("2020-04-30")
ui = fluidPage(
titlePanel("Shiny Test App"),
fluidRow(
column(3,
wellPanel(
selectInput(inputId = "chartType",
label = "Choose a Chart:",
selected="Customers",
choices = c("Customers","Charges")
),
selectInput(inputId = "siteid",
label = "Choose a Site:",
selected = "A",
choices = unique(shinyData$SITEID)),
dateRangeInput('dateRangeCal', "Input Date Range:",start = dateRangMin,end=dateRangMax, format = "mm/dd"),
checkboxGroupInput(
inputId = "stats",
label = "Display Stats",
selected = c("Mean","Standard Error"),
inline = T,
choices = c("Mean","Standard Error","3-Day Moving Avg")
),
actionButton("redraw","Submit")
)
),
column(9,
tabsetPanel(
tabPanel("Plot",plotOutput(outputId = "CustomersPlot"))
)
)
),
conditionalPanel(condition = "input.tabs == 'Plot",
fluidRow(
column(3,
plotOutput(outputId = "PieChart")
),
column(9,
plotOutput(outputId = "pctDrop")
)
)
),
)
server = function(input, output,session) {
charts <- tribble(
~chartName, ~var, ~y_label, ~sig.fig,
"Customers", "Customers", "Customers", 0,
"Charges", "Charges", "Charges", 0
)
chartVar =eventReactive(input$chartType,{charts$var[charts$chartName==input$chartType]})
y_label = eventReactive(chartVar(),{charts$y_label[charts$var==chartVar()]})
observeEvent(input$chartType, {
endDate = if_else(input$chartType %in% c("RVU","Charges","Charges/Staffed Hrs","RVU/Staffed Hrs","Acuity"),altEndDate, dateRangMax)
startDate = endDate-days(14)
updateDateRangeInput(session = session, inputId = 'dateRangeCal',
label = 'Date range input:',
start = startDate,
end = endDate
)
})
displayData <- eventReactive(input$redraw|input$redraw==0, {
shinyData %>%
dplyr::filter(SITEID==input$siteid) %>%
select(-SITEID) %>%
dplyr::filter(date>=input$dateRangeCal[1]&date<=input$dateRangeCal[2]|date>=input$dateRangeCal[1]-years(1)&date<=input$dateRangeCal[2]-years(1)) %>%
ungroup()
})
CustomersPlotRct <- eventReactive(input$redraw|input$redraw==0,{
means = displayData() %>%
group_by(year) %>%
summarise_all(mean)
p = ggplot(displayData(),aes(x=mon.day,y=!!sym(chartVar()),group=year,color=year))+
geom_point(size=3)+
geom_line(alpha=0.3,size=1.5)+
theme(axis.text.x = element_text(angle = 45,hjust=1.1))+
scale_y_continuous(labels = scales::number_format(accuracy = 1))+
labs(title= paste0("YoY ",y_label()," - ",input$siteid),x="Date",y=y_label())+
guides(size=F)
if (any(input$stats=="Mean")) {
p=p+stat_smooth(method="lm", formula=y~1, se=(any(input$stats=="Standard Error")))+
geom_text(aes(x = 3, y = !!sym(chartVar()), label = paste0("Mean = ",comma(!!sym(chartVar()), 0)), color = year,size=5,vjust=-3), data = means)
}
if (any(input$stats=="3-Day Moving Avg")) {
p=p+geom_ma(ma_fun = SMA,n=3,linetype=5,size=1.5,alpha=0.7)
}
p
})
output$CustomersPlot <- renderPlot({
CustomersPlotRct()
})
PieChartRct <- eventReactive(input$redraw|input$redraw==0,{
pieData = displayData() %>%
ungroup() %>%
select(year,Customers,Charges) %>%
group_by(year) %>%
summarise_all(funs(sum))
pieCol = pieData %>% pull(!!sym(chartVar()))
ggplot(pieData,aes(x="",fill=year,group=factor(year),y=!!sym(chartVar())))+
geom_col(width = 1)+
coord_polar("y")+
geom_text(aes(label = paste0(comma(!!sym(chartVar()),digits = 0) , " (", round(!!sym(chartVar())/sum(pieCol)*100,0),"%)")),
position = position_stack(vjust = 0.5)) +
theme_classic() +
theme(axis.text = element_blank(),
axis.ticks = element_blank(),
line = element_blank(),
panel.grid = element_blank())+
labs(fill = "Year",
x = NULL,
y = NULL,
title = "Cumulative Over Date Range:")
})
output$PieChart = renderPlot({
PieChartRct()
})
pctDropRct <- eventReactive(input$redraw|input$redraw==0,{
pctDropData = displayData() %>%
rename( "vr" = chartVar() ) %>%
group_by(mon.day) %>%
dplyr::filter(length(vr)==2) %>%
summarise(
pct.chg = round((vr[year==2020]-vr[year==2019])/vr[year==2019]*100,1)
)
p = ggplot(pctDropData,aes(x=mon.day,y=pct.chg,group=1))+
geom_point(stat='summary', fun.y=sum,size=3,color="green4") +
stat_summary(fun.y=sum, geom="line",alpha=0.3,size=1.5,color="green4")+
theme(axis.text.x = element_text(angle = 45,hjust=1.1))+
labs(title= paste0("YoY ",y_label()," % Change - ",input$siteid),x="Date",y="% Change")
if (any(input$stats=="Mean")) {
p=p+stat_smooth(method="lm", formula=y~1, se=(any(input$stats=="Standard Error")),color="green4")+
annotate("text",x = 4, y = mean(pctDropData$pct.chg) , label = paste0("Mean = ",round(mean(pctDropData$pct.chg),0),"%"),size=5,vjust=-3)
}
if (any(input$stats=="3-Day Moving Avg")) {
p=p+geom_ma(ma_fun = SMA,n=3,linetype=5,size=1.5,alpha=0.7,color="green4")
}
p
})
output$pctDrop = renderPlot({
pctDropRct()
})
}
shinyApp(ui,server)
解决方案
上面代码的问题是在条件面板中检查时没有广播 tabsetPanel id。更改此代码段为我修复了它:
column(9,
tabsetPanel(id="tabs",
tabPanel("plot","Plot",plotOutput(outputId = "CustomersPlot"))
)
)
),
conditionalPanel(condition = "input.tabs == 'plot",
推荐阅读
- python - DRF 序列化问题:结合 django-simple-history 和 django-polymorphic
- r - 按组计算时间的相对变化
- c++ - Visual Studio 2017:无法打开包含文件 'd3dx9.h' 在 .exe 应用程序使用的静态库中没有此类文件或目录
- python - 我怎样才能有两个表 A 和 B,其中 B 具有 A 的所有列?
- flutter - 如何在状态转换时添加淡入/淡出
- node.js - Mongoose 不更新值
- postgresql - Sequelize:MariaDB 和 Postgres 之间的多对多关系
- mysql - MySql - 查询错误:错误:ER_OPERAND_COLUMNS:操作数应包含 1 列
- html - 在电子邮件中作为正文发送 RDLC
- windows - 使用 Ansible 配置 azure-arm Windows VM