Hi,
I have the following code that read the content of two editable datatables and produces three figures when a button is clicked:
@app.callback(Output('feat-importance-new', 'figure'),
Output('new-scores-dist', 'figure'),
Output('model-performance', 'figure'),
Input('submit-button', 'n_clicks'),
[State('table-weight', 'data'),
State('table-threshold', 'data')],
prevent_initial_callback=True)
def update_data(submit_button, weight_data, threshold_data):
if 'submit-button' == ctx.triggered_id:
global weight
global thres
df_weight = pd.DataFrame.from_records(weight_data)
weight = dict(zip(df_weight['Feature'], df_weight['new_Weight']))
df_thres = pd.DataFrame.from_records(threshold_data)
thres = dict(zip(df_thres['Feature'], df_thres['new_Threshold']))
df = remap_risk(df_table_copy)
df_en = one_hot_encoding(df)
df['rescore'] = df_en.apply(rescore, axis=1)
fig_featimp = feat_importance(df_en)
fig_rescore = px.histogram(df, x='rescore', color_discrete_sequence=['#eb3e00'])
fig_rescore.update_yaxes(showgrid=True, gridcolor='LightGray')
fig_rescore.update_layout(plot_bgcolor='white')
fig_perf = sanity_checks(df_en)
return fig_featimp, fig_rescore, fig_perf
else:
raise PreventUpdate
Now, the second and first figures are correctly updated upon button clicking. By this I mean that the current values from the tables are used.
However, if I only click once, the first figure still uses the old values. I need to click twice in order to update that particular figure.
The function that produces that figure is slow (30 seconds) whereas the others are fast.
I am going to try and save the edited tables to the store as opposed to reading the data from the tables directly.
However, I do not understand this behaviour. Given that the three figures are produced within the same callback, shouldn’t all of them be using the same input data?
Cheers,
Ed