@@ -212,7 +212,8 @@ ui <- fluidPage(padding=0, title="Forecast Eval Dashboard",
212
212
)
213
213
214
214
215
- server <- function (input , output , session ) {
215
+ # Get and prepare data
216
+ getS3Bucket <- function () {
216
217
# Connect to AWS s3bucket
217
218
Sys.setenv(" AWS_DEFAULT_REGION" = " us-east-2" )
218
219
s3bucket = tryCatch(
@@ -224,40 +225,95 @@ server <- function(input, output, session) {
224
225
return (NULL )
225
226
}
226
227
)
228
+
229
+ return (s3bucket )
230
+ }
227
231
228
- # Get and prepare data
229
- getData <- function (filename ){
230
- if (! is.null(s3bucket )) {
231
- tryCatch(
232
- {
233
- s3readRDS(object = filename , bucket = s3bucket )
234
- },
235
- error = function (e ) {
236
- e
237
- getFallbackData(filename )
238
- }
239
- )
240
- } else {
241
- getFallbackData(filename )
242
- }
232
+ getData <- function (filename , s3bucket ){
233
+ if (! is.null(s3bucket )) {
234
+ tryCatch(
235
+ {
236
+ s3readRDS(object = filename , bucket = s3bucket )
237
+ },
238
+ error = function (e ) {
239
+ e
240
+ getFallbackData(filename )
241
+ }
242
+ )
243
+ } else {
244
+ getFallbackData(filename )
243
245
}
246
+ }
244
247
245
- getFallbackData = function (filename ) {
246
- path = ifelse(
247
- file.exists(filename ),
248
- filename ,
249
- file.path(" ../dist/" ,filename )
250
- )
251
- readRDS(path )
248
+ getFallbackData = function (filename ) {
249
+ path = ifelse(
250
+ file.exists(filename ),
251
+ filename ,
252
+ file.path(" ../dist/" ,filename )
253
+ )
254
+ readRDS(path )
255
+ }
256
+
257
+ getAllData = function (s3bucket ) {
258
+ dfStateCases <- getData(" score_cards_state_cases.rds" , s3bucket )
259
+ dfStateDeaths <- getData(" score_cards_state_deaths.rds" , s3bucket )
260
+ dfNationCases = getData(" score_cards_nation_cases.rds" , s3bucket )
261
+ dfNationDeaths = getData(" score_cards_nation_deaths.rds" , s3bucket )
262
+ dfStateHospitalizations = getData(" score_cards_state_hospitalizations.rds" , s3bucket )
263
+ dfNationHospitalizations = getData(" score_cards_nation_hospitalizations.rds" , s3bucket )
264
+
265
+ # Pick out expected columns only
266
+ covCols = paste0(" cov_" , COVERAGE_INTERVALS )
267
+ expectedCols = c(" ahead" , " geo_value" , " forecaster" , " forecast_date" ,
268
+ " data_source" , " signal" , " target_end_date" , " incidence_period" ,
269
+ " actual" , " wis" , " sharpness" , " ae" , " value_50" ,
270
+ covCols )
271
+
272
+ dfStateCases = dfStateCases %> % select(all_of(expectedCols ))
273
+ dfStateDeaths = dfStateDeaths %> % select(all_of(expectedCols ))
274
+ dfNationCases = dfNationCases %> % select(all_of(expectedCols ))
275
+ dfNationDeaths = dfNationDeaths %> % select(all_of(expectedCols ))
276
+ dfStateHospitalizations = dfStateHospitalizations %> % select(all_of(expectedCols ))
277
+ dfNationHospitalizations = dfNationHospitalizations %> % select(all_of(expectedCols ))
278
+
279
+ df = rbind(dfStateCases , dfStateDeaths , dfNationCases , dfNationDeaths , dfStateHospitalizations , dfNationHospitalizations )
280
+ df = df %> % rename(" 10" = cov_10 , " 20" = cov_20 , " 30" = cov_30 , " 40" = cov_40 , " 50" = cov_50 , " 60" = cov_60 , " 70" = cov_70 , " 80" = cov_80 , " 90" = cov_90 , " 95" = cov_95 , " 98" = cov_98 )
281
+
282
+ return (df )
283
+ }
284
+
285
+ getRecentDataHelper = function () {
286
+ s3bucket <- getS3Bucket()
287
+ df <- data.frame ()
288
+
289
+ getRecentData = function () {
290
+ newS3bucket <- getS3Bucket()
291
+
292
+ s3Contents <- s3bucket [attr(s3bucket , " names" , exact = TRUE )]
293
+ newS3Contents <- newS3bucket [attr(newS3bucket , " names" , exact = TRUE )]
294
+
295
+ # Fetch new score data if contents of S3 bucket has changed (including file
296
+ # names, sizes, and last modified timestamps). Ignores characteristics of
297
+ # bucket and request, including bucket region, name, content type, request
298
+ # date, request ID, etc.
299
+ if ( nrow(df ) == 0 || ! identical(s3Contents , newS3Contents ) ) {
300
+ # Save new data and new bucket connection info to vars in env of
301
+ # `getRecentDataHelper`. They persist between calls to `getRecentData` a
302
+ # la https://stackoverflow.com/questions/1088639/static-variables-in-r
303
+ s3bucket <<- newS3bucket
304
+ df <<- getAllData(s3bucket )
305
+ }
306
+
307
+ return (df )
252
308
}
309
+
310
+ return (getRecentData )
311
+ }
253
312
254
- dfStateCases <- getData(" score_cards_state_cases.rds" )
255
- dfStateDeaths <- getData(" score_cards_state_deaths.rds" )
256
- dfNationCases = getData(" score_cards_nation_cases.rds" )
257
- dfNationDeaths = getData(" score_cards_nation_deaths.rds" )
258
- dfStateHospitalizations = getData(" score_cards_state_hospitalizations.rds" )
259
- dfNationHospitalizations = getData(" score_cards_nation_hospitalizations.rds" )
260
- DATA_LOADED = TRUE
313
+ getRecentData <- getRecentDataHelper()
314
+
315
+
316
+ server <- function (input , output , session ) {
261
317
TERRITORIES = c(' AS' , ' GU' , ' MP' , ' VI' )
262
318
PREV_AS_OF_DATA = reactiveVal(NULL )
263
319
AS_OF_CHOICES = reactiveVal(NULL )
@@ -276,24 +332,10 @@ server <- function(input, output, session) {
276
332
CURRENT_WEEK_END_DATE = reactiveVal(CASES_DEATHS_CURRENT )
277
333
prevHospWeek <- seq(Sys.Date()- 11 ,Sys.Date()- 5 ,by = ' day' )
278
334
HOSP_CURRENT = prevHospWeek [weekdays(prevHospWeek )== ' Wednesday' ]
279
-
280
-
281
- # Pick out expected columns only
282
- covCols = paste0(" cov_" , COVERAGE_INTERVALS )
283
- expectedCols = c(" ahead" , " geo_value" , " forecaster" , " forecast_date" ,
284
- " data_source" , " signal" , " target_end_date" , " incidence_period" ,
285
- " actual" , " wis" , " sharpness" , " ae" , " value_50" ,
286
- covCols )
287
-
288
- dfStateCases = dfStateCases %> % select(all_of(expectedCols ))
289
- dfStateDeaths = dfStateDeaths %> % select(all_of(expectedCols ))
290
- dfNationCases = dfNationCases %> % select(all_of(expectedCols ))
291
- dfNationDeaths = dfNationDeaths %> % select(all_of(expectedCols ))
292
- dfStateHospitalizations = dfStateHospitalizations %> % select(all_of(expectedCols ))
293
- dfNationHospitalizations = dfNationHospitalizations %> % select(all_of(expectedCols ))
294
335
295
- df = rbind(dfStateCases , dfStateDeaths , dfNationCases , dfNationDeaths , dfStateHospitalizations , dfNationHospitalizations )
296
- df = df %> % rename(" 10" = cov_10 , " 20" = cov_20 , " 30" = cov_30 , " 40" = cov_40 , " 50" = cov_50 , " 60" = cov_60 , " 70" = cov_70 , " 80" = cov_80 , " 90" = cov_90 , " 95" = cov_95 , " 98" = cov_98 )
336
+ # Get scores
337
+ df = getRecentData()
338
+ DATA_LOADED = TRUE
297
339
298
340
# Prepare input choices
299
341
forecasterChoices = sort(unique(df $ forecaster ))
0 commit comments