@@ -125,10 +125,22 @@ shinyApp(
125
125
multiple = TRUE ,
126
126
selected = c(" as" , " gu" , " mp" , " vi" )
127
127
),
128
+ selectInput(" excluded_aheads" ,
129
+ " Exclude aheads:" ,
130
+ choices = 1 : 28 ,
131
+ multiple = TRUE
132
+ )
128
133
),
129
134
mainPanel(
130
- plotlyOutput(" main_plot" , height = " 90em" ),
131
- width = 8
135
+ verticalLayout(
136
+ plotlyOutput(" main_plot" , height = " 90em" ),
137
+ h2(" forecaster name -> parameters" ),
138
+ # textOutput("forecaster_param_title"),
139
+ dataTableOutput(" forecaster_table" ),
140
+ h2(" ensemble name -> parameters" ),
141
+ dataTableOutput(" ensemble_table" )
142
+ ),
143
+ width = 8
132
144
)
133
145
)
134
146
)
@@ -137,24 +149,27 @@ shinyApp(
137
149
filtered_scorecards_reactive <- reactive({
138
150
agg_forecasters <- unique(c(input $ selected_forecasters , input $ baseline ))
139
151
if (length(agg_forecasters ) == 0 ||
140
- all(agg_forecasters == " " | is.null(agg_forecasters ) | is.na(agg_forecasters ))
152
+ all(agg_forecasters == " " | is.null(agg_forecasters ) | is.na(agg_forecasters ))
141
153
) {
142
154
return (data.frame ())
143
155
}
144
156
145
157
processed_evaluations_internal <- lapply(agg_forecasters , function (forecaster ) {
146
- load_forecast_data(forecaster ) %>> %
158
+ load_forecast_data(forecaster ) %>> %
147
159
filter(
148
160
.data $ forecast_date %>> % between(.env $ input $ selected_forecast_date_range [[1L ]], .env $ input $ selected_forecast_date_range [[2L ]]),
149
161
.data $ target_end_date %>> % between(.env $ input $ selected_target_end_date_range [[1L ]], .env $ input $ selected_target_end_date_range [[2L ]]),
150
- ! .data $ geo_value %in% c(.env $ input $ excluded_geo_values , " us" )
162
+ ! .data $ geo_value %in% c(.env $ input $ excluded_geo_values , " us" ),
163
+ ! .data $ ahead %in% .env $ input $ excluded_aheads
151
164
)
152
- }) %> %
165
+ }) %> %
153
166
bind_rows()
154
167
})
155
168
output $ main_plot <- renderPlotly({
156
169
input_df <- filtered_scorecards_reactive()
157
- if (nrow(input_df ) == 0 ) { return () }
170
+ if (nrow(input_df ) == 0 ) {
171
+ return ()
172
+ }
158
173
159
174
# Normalize by baseline scores. This is not relevant for coverage, which is compared
160
175
# to the nominal confidence level.
@@ -184,7 +199,7 @@ shinyApp(
184
199
185
200
x_tick_angle <- list (tickangle = - 30 )
186
201
facet_x_tick_angles <- setNames(rep(list (x_tick_angle ), 10 ), paste0(" xaxis" , 1 : 10 ))
187
- scale_type <- ifelse(input $ facets_share_scale , " fixed" , " free_y" )
202
+ scale_type <- ifelse(input $ facets_share_scale , " fixed" , " free_y" )
188
203
189
204
input_df %>> %
190
205
# Aggregate scores over all geos
@@ -208,13 +223,11 @@ shinyApp(
208
223
),
209
224
na.rm = TRUE
210
225
)) %>> %
211
- # Use scatterplot or lines depending on the x var. Also, if the range
226
+ # Use scatterplot or lines depending on the x var. ~~ Also, if the range
212
227
# of obs by forecaster is too wide, plot using points instead of
213
- # lines.
228
+ # lines.~~ too wide a range of observations is better than too many thick points
214
229
{
215
- if (input $ x_var %in% c(input $ facet_vars , " geo_value" , " forecaster" , " ahead" ) || range(plot.df [[" n" ]]) %>> % {
216
- . [[2L ]] > 1.2 * . [[1L ]]
217
- }) {
230
+ if (input $ x_var %in% c(input $ facet_vars , " geo_value" , " forecaster" , " ahead" )) {
218
231
. + geom_point(aes(size = n )) + expand_limits(size = 0 )
219
232
} else {
220
233
. + geom_line()
@@ -228,9 +241,36 @@ shinyApp(
228
241
} else {
229
242
facet_grid(as.formula(paste0(input $ facet_vars [[1L ]], " ~ " , paste(collapse = " + " , input $ facet_vars [- 1L ]))), scales = scale_type )
230
243
}) %>> %
231
- ggplotly() %>> %
232
- { inject(layout(. , hovermode = " x unified" , legend = list (orientation = " h" , title = list (text = " forecaster" )), xaxis = x_tick_angle , !!! facet_x_tick_angles ))}
233
-
244
+ ggplotly() %>> % {
245
+ inject(layout(. , hovermode = " x unified" , legend = list (orientation = " h" , title = list (text = " forecaster" )), xaxis = x_tick_angle , !!! facet_x_tick_angles ))
246
+ }
234
247
})
248
+ # # output$forecaster_param_title <- renderText("forecast name -> parameters")
249
+
250
+ output $ forecaster_table <- renderDataTable(
251
+ tar_read(forecaster_params_grid ) %> %
252
+ select(- id ) %> %
253
+ mutate(across(where(is.list ), map , `%||%` , c(0 , 7 , 14 ))) %> %
254
+ mutate(lags = paste(lags , sep = " ," )) %> %
255
+ group_by(parent_id ) %> %
256
+ mutate(ahead = toString(unique(ahead ))) %> %
257
+ ungroup() %> %
258
+ distinct(parent_id , .keep_all = TRUE ) %> %
259
+ rename(name = parent_id ) %> %
260
+ select(name , everything())
261
+ )
262
+ output $ ensemble_table <- renderDataTable(
263
+ tar_read(ensemble_forecasters ) %> %
264
+ select(- id ) %> %
265
+ group_by(parent_id ) %> %
266
+ mutate(ahead = toString(unique(ahead ))) %> %
267
+ ungroup() %> %
268
+ distinct(parent_id , .keep_all = TRUE ) %> %
269
+ rename(name = parent_id ) %> %
270
+ mutate(ensemble_params = paste(ensemble_params , sep = " ," )) %> %
271
+ mutate(forecaster_ids = paste(forecaster_ids , sep = " ," )) %> %
272
+ select(name , everything()) %> %
273
+ select(- forecasters )
274
+ )
235
275
}
236
276
)
0 commit comments