回调如何处理Dash中可变数量的多个输入

2024-04-26 02:44:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我想开发一个程序,能够动态计算不同类型分布(正态分布、对数正态分布)的平均值。分布函数分别需要两个和三个输入参数

我的回调返回一个错误:“输入中使用了一个不存在的对象…”,因为总是有三个输入参数传递给函数

有人知道如何解决这个问题吗

谢谢

import dash
from jupyter_dash import JupyterDash
import dash_core_components as dcc
import dash_html_components as html
import dash_bootstrap_components as dbc
from dash.dependencies import Input, Output, State
import plotly.graph_objs as go
import pandas as pd
import numpy as np
import scipy.stats as stats

#app = dash.Dash()
app = JupyterDash(external_stylesheets=[dbc.themes.BOOTSTRAP], suppress_callback_exceptions=True)

app.layout = html.Div([
dbc.Card(
    dbc.CardBody([
        dbc.Row([
            dbc.Col([

                dbc.Row([
                    dcc.Dropdown(
                        id='dd-dist',
                        clearable = False,
                        options=[
                            {'label': 'Normal', 'value': 'NOR'},
                            {'label': 'Log-Normal', 'value': 'LGN'},
                        ], 
                        style={'width': '60%'},
                        value='LGN'
                    )
                ],),



                html.Div(
                    id='parameter-input'
                ),

                dbc.Row([
                    dbc.Col([
                        html.H5('Mean')
                    ],width={'size': 5, 'offset': 0}),
                    dbc.Col([
                        dcc.Input(
                            id='mean-out',
                            value= None,
                        )
                    ]) 
                ]),



            ], width={'size': 4, 'offset': 0, 'order': 1}),

        ], align='center'),

    ])
)

], style={'padding': 10})



@app.callback(
    Output('parameter-input', 'children'),
    [Input('dd-dist', 'value')])
def update_parameter(value):
    if 'LGN' == value:
        return (dbc.Row([
                    dbc.Col([
                        html.H5('Shape')
                    ],width={'size': 5, 'offset': 0}),
                    dbc.Col([
                        dcc.Input(
                            id='param1-in',
                            debounce = True,
                            value = 1,
                            min= 0,
                            max= 10,
                            style = {'fontSize': 14}
                        )
                    ],width={'size': 4, 'offset': 0}, align='end')


                ]),

            dbc.Row([
                    dbc.Col([
                        html.H5('Location')
                    ],width={'size': 5, 'offset': 0}),
                    dbc.Col([
                        dcc.Input(
                            id='param2-in',
                            debounce = True,
                            value = 1,
                            min=0,
                            max=5,
                            style = {'fontSize': 14}
                        )
                    ],width={'size': 4, 'offset': 0}, align='end')


                ]),

            dbc.Row([
                    dbc.Col([
                        html.H5('Scale')
                    ],width={'size': 5, 'offset': 0}),
                    dbc.Col([
                        dcc.Input(
                            id='param3-in',
                            debounce = True,
                            value = 1,
                            min=0,
                            max=5,
                            style = {'fontSize': 14}
                        )
                    ],width={'size': 4, 'offset': 0}, align='end')


                ])
        )

    elif 'NOR' == value:
        return (dbc.Row([
                    dbc.Col([
                        html.H5('Mean')
                    ],width={'size': 5, 'offset': 0}),
                    dbc.Col([
                        dcc.Input(
                            id='param1-in',
                            debounce = True,
                            value = 1,
                            min= 0,
                            max= 10,
                            style = {'fontSize': 14}
                        )
                    ],width={'size': 4, 'offset': 0}, align='end')


                ]),

            dbc.Row([
                    dbc.Col([
                        html.H5('Standard deviation')
                    ],width={'size': 5, 'offset': 0}),
                    dbc.Col([
                        dcc.Input(
                            id='param2-in',
                            debounce = True,
                            value = 1,
                            min=0,
                            max=5,
                            style = {'fontSize': 14}
                        )
                    ],width={'size': 4, 'offset': 0}, align='end')
            ])
        )

@app.callback(
    Output('mean-out', 'value'),
    [Input('dd-dist', 'value'),
     Input('param1-in', 'value'),
     Input('param2-in', 'value'),
     Input('param3-in', 'value')
     ]
)
def return_mean(dist, param1, param2, param3):
    if dist == 'LGN':
        return round(stats.lognorm.mean(float(param1), float(param2), float(param3)), 3)
    elif dist == 'NOR':
        return round(stats.norm.mean(float(param1), float(param2)), 3)

if __name__ == '__main__':
    app.run_server(mode='external')

Tags: inimportidinputsizevaluehtmlas
1条回答
网友
1楼 · 发布于 2024-04-26 02:44:37

我可能误解了这一点,但在我看来,你需要不同数量的论点。在python中执行此操作的正确方法是以下语法:

def test(*args):
    for arg in args:
        print(arg)

此函数将接受任意数量的输入,并在*args创建所有尾随参数的列表时按顺序打印它们。应该注意的是,位置参数仍然可以放在前面,如果它没有收到任何参数,它不会引发错误,它只会创建一个空列表

如果你有任何问题,或者这不是你想要的,一定要发表评论

相关问题 更多 >