回调警告:回调错误创建破折号'数据表
Callback warning: Callback error creating dash' DataTable
我正在尝试从回调生成 table,虽然 table 实际上正在生成,但我收到警告:
Callback error updating priceTable.data, priceTable.columns
dash.exceptions.InvalidCallbackReturnValue: The callback ..priceTable.data...priceTable.columns.. is a multi-output.
Expected the output type to be a list or tuple but got:
None.
我知道我的问题在于我如何布置回调,但我不确定正确的格式应该是什么。我在网上找到了 答案,这对我有很大帮助,因为我之前有 'return dt.DataTable(data = data, columns=columns)'。
代码布局:
import dash
import dash_html_components as html
import dash_core_components as dcc
import dash_table as dt
from dash.dependencies import Input, Output, State
from dash.exceptions import PreventUpdate
import pandas as pd
df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/solar.csv')
app = dash.Dash(__name__)
states = df.State.unique().tolist()
numSP = df['Number of Solar Plants'].unique().tolist()
app.layout = html.Div([
dcc.Dropdown(
id='filter_dropdown',
options=[{'label':st, 'value':st} for st in states],
value = states[0]
),
html.Br(),
dcc.Dropdown(
id='filter2',
options=[{'label':np, 'value':np} for np in numSP]
#value = numSP[0]
),
html.Br(),
html.Button('Submit', id='submit-button-state', n_clicks=0),
html.Br(),
html.Div(id='output'),
html.Div(
#id ='priceTable'
dt.DataTable(id='priceTable')
)
])
回调部分代码:
@app.callback(
[Output('priceTable', 'data'),Output('priceTable', 'columns')],
[Input('submit-button-state', 'n_clicks')],
[State('filter_dropdown', 'value')],
[State('filter2', 'value')],
[State('submit-button-state', 'n_clicks')],
)
def update_table(n_clicks, filter_dropdown, filter2, table):
if n_clicks:
if filter_dropdown is None and filter2 is None:
raise PreventUpdate
if filter_dropdown is not None and filter2 is not None:
table = df[df.State == filter_dropdown]
table = table[table['Number of Solar Plants'] == filter2]
if filter_dropdown is None and filter2 is not None:
table = df[df['Number of Solar Plants'] == filter2]
if filter_dropdown is not None and filter2 is None:
table = df[df.State == filter_dropdown]
columns = [{"name": i, "id": i,} for i in (table.columns)]
data = table.to_dict('records')
return data, columns
我尝试过的事情:
- 我尝试以不同的方式列出我的输出:[Output('priceTable', 'data')],[Output('priceTable', 'columns')] , 或 [Output('priceTable', 'data'),Output('priceTable', 'columns'),],
- 正在将数据和列分配给 get 返回的变量:
priceTable = (data, columns)
return priceTable
谢谢!
它不起作用的原因是你没有在你的回调中处理按钮没有被点击的情况。即使按钮没有被点击,你的回调仍然需要 return 一个元组(你的 data
和 columns
)。
这就是这里的错误所在:
Expected the output type to be a list or tuple but got: None.
当 n_clicks
是 0
(false
) 时,你什么都不 return (None
)。
所以你需要做的是 return 当 n_clicks
是 0
时 data
和 columns
。与现有方法的唯一区别是,如果 n_clicks
是 0
.
,则不会对数据应用任何过滤器
完整示例:
import dash
import dash_html_components as html
import dash_core_components as dcc
import dash_table as dt
from dash.dependencies import Input, Output, State
from dash.exceptions import PreventUpdate
import pandas as pd
df = pd.read_csv("https://raw.githubusercontent.com/plotly/datasets/master/solar.csv")
app = dash.Dash(__name__)
states = df.State.unique().tolist()
numSP = df["Number of Solar Plants"].unique().tolist()
app.layout = html.Div(
[
dcc.Dropdown(
id="filter_dropdown",
options=[{"label": st, "value": st} for st in states],
value=states[0],
),
html.Br(),
dcc.Dropdown(
id="filter2",
options=[{"label": np, "value": np} for np in numSP]
# value = numSP[0]
),
html.Br(),
html.Button("Submit", id="submit-button-state", n_clicks=0),
html.Br(),
html.Div(id="output"),
html.Div(
# id ='priceTable'
dt.DataTable(id="priceTable")
),
]
)
def get_table_data(data):
columns = [
{
"name": i,
"id": i,
}
for i in (data.columns)
]
data = data.to_dict("records")
return (data, columns)
@app.callback(
[Output("priceTable", "data"), Output("priceTable", "columns")],
[Input("submit-button-state", "n_clicks")],
[State("filter_dropdown", "value")],
[State("filter2", "value")],
[State("submit-button-state", "n_clicks")],
)
def update_table(n_clicks, filter_dropdown, filter2, table):
if n_clicks:
if filter_dropdown is None and filter2 is None:
raise PreventUpdate
if filter_dropdown is not None and filter2 is not None:
table = df[df.State == filter_dropdown]
table = table[table["Number of Solar Plants"] == filter2]
if filter_dropdown is None and filter2 is not None:
table = df[df["Number of Solar Plants"] == filter2]
if filter_dropdown is not None and filter2 is None:
table = df[df.State == filter_dropdown]
(data, columns) = get_table_data(table)
print("columns", columns)
print("data", columns)
return data, columns
return get_table_data(df)
if __name__ == "__main__":
app.run_server(debug=True)
在上面的示例中,我还将用于从数据框中检索数据和列的代码放在它自己的函数中 get_table_data
。为了确保你的数据元组总是 returned 我使用了 guard clause.
我正在尝试从回调生成 table,虽然 table 实际上正在生成,但我收到警告:
Callback error updating priceTable.data, priceTable.columns
dash.exceptions.InvalidCallbackReturnValue: The callback ..priceTable.data...priceTable.columns.. is a multi-output. Expected the output type to be a list or tuple but got: None.
我知道我的问题在于我如何布置回调,但我不确定正确的格式应该是什么。我在网上找到了
代码布局:
import dash
import dash_html_components as html
import dash_core_components as dcc
import dash_table as dt
from dash.dependencies import Input, Output, State
from dash.exceptions import PreventUpdate
import pandas as pd
df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/solar.csv')
app = dash.Dash(__name__)
states = df.State.unique().tolist()
numSP = df['Number of Solar Plants'].unique().tolist()
app.layout = html.Div([
dcc.Dropdown(
id='filter_dropdown',
options=[{'label':st, 'value':st} for st in states],
value = states[0]
),
html.Br(),
dcc.Dropdown(
id='filter2',
options=[{'label':np, 'value':np} for np in numSP]
#value = numSP[0]
),
html.Br(),
html.Button('Submit', id='submit-button-state', n_clicks=0),
html.Br(),
html.Div(id='output'),
html.Div(
#id ='priceTable'
dt.DataTable(id='priceTable')
)
])
回调部分代码:
@app.callback(
[Output('priceTable', 'data'),Output('priceTable', 'columns')],
[Input('submit-button-state', 'n_clicks')],
[State('filter_dropdown', 'value')],
[State('filter2', 'value')],
[State('submit-button-state', 'n_clicks')],
)
def update_table(n_clicks, filter_dropdown, filter2, table):
if n_clicks:
if filter_dropdown is None and filter2 is None:
raise PreventUpdate
if filter_dropdown is not None and filter2 is not None:
table = df[df.State == filter_dropdown]
table = table[table['Number of Solar Plants'] == filter2]
if filter_dropdown is None and filter2 is not None:
table = df[df['Number of Solar Plants'] == filter2]
if filter_dropdown is not None and filter2 is None:
table = df[df.State == filter_dropdown]
columns = [{"name": i, "id": i,} for i in (table.columns)]
data = table.to_dict('records')
return data, columns
我尝试过的事情:
- 我尝试以不同的方式列出我的输出:[Output('priceTable', 'data')],[Output('priceTable', 'columns')] , 或 [Output('priceTable', 'data'),Output('priceTable', 'columns'),],
- 正在将数据和列分配给 get 返回的变量:
priceTable = (data, columns)
return priceTable
谢谢!
它不起作用的原因是你没有在你的回调中处理按钮没有被点击的情况。即使按钮没有被点击,你的回调仍然需要 return 一个元组(你的 data
和 columns
)。
这就是这里的错误所在:
Expected the output type to be a list or tuple but got: None.
当 n_clicks
是 0
(false
) 时,你什么都不 return (None
)。
所以你需要做的是 return 当 n_clicks
是 0
时 data
和 columns
。与现有方法的唯一区别是,如果 n_clicks
是 0
.
完整示例:
import dash
import dash_html_components as html
import dash_core_components as dcc
import dash_table as dt
from dash.dependencies import Input, Output, State
from dash.exceptions import PreventUpdate
import pandas as pd
df = pd.read_csv("https://raw.githubusercontent.com/plotly/datasets/master/solar.csv")
app = dash.Dash(__name__)
states = df.State.unique().tolist()
numSP = df["Number of Solar Plants"].unique().tolist()
app.layout = html.Div(
[
dcc.Dropdown(
id="filter_dropdown",
options=[{"label": st, "value": st} for st in states],
value=states[0],
),
html.Br(),
dcc.Dropdown(
id="filter2",
options=[{"label": np, "value": np} for np in numSP]
# value = numSP[0]
),
html.Br(),
html.Button("Submit", id="submit-button-state", n_clicks=0),
html.Br(),
html.Div(id="output"),
html.Div(
# id ='priceTable'
dt.DataTable(id="priceTable")
),
]
)
def get_table_data(data):
columns = [
{
"name": i,
"id": i,
}
for i in (data.columns)
]
data = data.to_dict("records")
return (data, columns)
@app.callback(
[Output("priceTable", "data"), Output("priceTable", "columns")],
[Input("submit-button-state", "n_clicks")],
[State("filter_dropdown", "value")],
[State("filter2", "value")],
[State("submit-button-state", "n_clicks")],
)
def update_table(n_clicks, filter_dropdown, filter2, table):
if n_clicks:
if filter_dropdown is None and filter2 is None:
raise PreventUpdate
if filter_dropdown is not None and filter2 is not None:
table = df[df.State == filter_dropdown]
table = table[table["Number of Solar Plants"] == filter2]
if filter_dropdown is None and filter2 is not None:
table = df[df["Number of Solar Plants"] == filter2]
if filter_dropdown is not None and filter2 is None:
table = df[df.State == filter_dropdown]
(data, columns) = get_table_data(table)
print("columns", columns)
print("data", columns)
return data, columns
return get_table_data(df)
if __name__ == "__main__":
app.run_server(debug=True)
在上面的示例中,我还将用于从数据框中检索数据和列的代码放在它自己的函数中 get_table_data
。为了确保你的数据元组总是 returned 我使用了 guard clause.