破折号:创建多个回调(带循环?)

时间:2018-12-24 20:59:23

标签: plotly-dash

说我有一个带有20个参数的模型,并且为每个参数制作了一个输入组件。

[dcc.Input(type = 'number', id = 'input %i'%i) for i in range(20)]

我想要一个按钮html.Button('populate parameters', id = 'button populate'),该按钮应该为所有输入填充最佳的预拟合值。

代码如下所示,除非它不起作用。

for i in range(20):
    @app.callback(
        dash.dependencies.Output('input %i'%i, 'value'),
        [dash.dependencies.Input('button populate', 'n_clicks')]
    )
    def update(ignore):
        return np.random.uniform()

是否必须为具有相同功能的每个输出编写20个回调?我找不到一种可以一口气制作(循环吗?)的方法

4 个答案:

答案 0 :(得分:2)

我已经处理了相同的问题,并找到了解决方案。您要做的是绕过装饰器并直接调用app.callback函数:

def update(ignore):
    return np.random.uniform()

for i in range(20):
    app.callback(
        dash.dependencies.Output('input %i' % i, 'value'),
        [dash.dependencies.Input('button populate', 'n_clicks')]
    )(update)

答案 1 :(得分:1)

您可以在dash >= 1.11.0中使用Pattern-Matching Callbacks。定义回调时无需循环。

示例

1。导入回调选择器

  • 导入dash.dependecies.ALL
from dash.dependencies import Input, Output, State, ALL
  • 其他可用的回调选择器是MATCHALLSMALLER

2。使用字典作为id

  • 使用id词典来定义组件。您可以选择任何键,但是例如typeid是相当合理的选择。因此,代替
[dcc.Input(type = 'number', id = 'input %i'%i) for i in range(20)]

使用

[
    dcc.Input(type='number',
              id={
                  'type': 'my-input-type',
                  'id': 'input %i' % i
              }) for i in range(20)
]

3。将回调选择器与@app.callback

一起使用
  • 在定义回调时使用ALL回调选择器:
@app.callback(
    dash.dependencies.Output({
        'type': 'my-input-type',
        'id': ALL
    }, 'value'), [dash.dependencies.Input('button populate', 'n_clicks')])
def update(ignore):
    return np.random.uniform()

答案 2 :(得分:0)

您可以根据需要在回调上具有任意多个输入参数/参数。 但是只有一个输出

为我解决类似情况的是:

@app.callback(
    [Output('output-id', 'children')],
    [Input('button-trigger', 'n_clicks'],
    [State('input-one', 'value'),
    ...
    [State('input-twenty', 'value')]
)
def my_fancy_function(n_clicks, v1, ..., v20):
    return sth_awesome
与输入State()相对的{p> Input()不会在更改输入值时触发回调。

n_clicks每次点击都会更改+1,但无需使用。

如果您的参数相互依赖,则需要更多的回调。 但是...具有20个参数There must be a better way

答案 3 :(得分:0)

我已经做了类似的页面重载后填充我的布局组件的东西。

由于所述第一回调,所述组件的状态处于dcc.Store部件存储。 第二个回调是在状态更改或访问选项卡时填充布局组件(布局位于dcc.Tab中)

drawable-xx

请注意,您将无法访问函数(set_back_component(...))中的迭代值(component_id和component_property)