首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么当我更改一个不应该触发任何更新的按钮设置时,我的绘图会被面板(两次)更新?(Holoviz小组)

为什么当我更改一个不应该触发任何更新的按钮设置时,我的绘图会被面板(两次)更新?(Holoviz小组)
EN

Stack Overflow用户
提问于 2019-09-26 09:48:44
回答 1查看 836关注 0票数 1

我上了一堂课去探索和训练模特。

当我在下面的代码示例中更改下拉“choose_model_type”的值时,我希望仪表板中不会有任何变化,因为我的类中没有@param.depends('choose_model_type', watch=True)。但是,当我更改下拉“choose_model_type”的值时,仪表板就会更新。在本例中,如果查看日志,函数plot_y()将被触发两次:

2019-09-26 11:24:42,802启动plot_y 2019-09-26 11:24:42,825启动plot_y

这是给我意想不到的行为。我不希望在更改'choose_model_type‘时触发plot_y()。

如何确保只有在“y”更改(以及我的绘图在仪表板中更新),而不是当其他参数(如下拉列表)发生更改时,plot_y才被触发?

我想控制什么被触发时,但对我来说,似乎有一些魔术正在进行。

其他相关问题是:

为什么plot_y()会被触发两次?如果我更改'pred_target‘,它也会触发plot_y()两次。当我更改‘Same _model_type’的值时也会发生同样的情况: plot_y()被触发两次。

代码语言:javascript
复制
# library imports    
import logging

import numpy as np
import pandas as pd

import hvplot
import hvplot.pandas

import holoviews as hv
from holoviews.operation.datashader import datashade, dynspread
hv.extension('bokeh', logo=False)

import panel as pn
import param

# create some sample data
df = pd.DataFrame(np.random.choice(100, size=[50, 2]), columns=['TARGET1', 'TARGET2'])

# class to train my models with some settings
class ModelTrainer(param.Parameterized):

    logging.info('initializing class')

    pred_target = param.Selector(
        default='TARGET1',
        objects=['TARGET1', 'TARGET2'],
        label='Choose prediction target'
    )

    choose_model_type = param.Selector(
        default='LINEAR', 
        objects=['LINEAR', 'LGBM', 'RANDOM_FOREST'],
        label='Choose type of model',
    )

    y = df[pred_target.default]


    # i expect this function only to be triggered when pred_target changes
    @param.depends('pred_target', watch=True)
    def _reset_variables(self):
        logging.info('starting reset variables')
        self.y = df[self.pred_target]

    # i expect plot_y() only to be triggered when y changes   
    @param.depends('y', watch=True)
    def plot_y(self):
        logging.info('starting plot_y')
        self.y_plot = dynspread(datashade(self.y.hvplot.scatter()))
        return self.y_plot

model_trainer = ModelTrainer()

# show model dashboard
pn.Column(
    pn.Row(model_trainer.param['pred_target']),
    pn.Row(model_trainer.param['choose_model_type']),
    pn.Row(model_trainer.plot_y)
).servable()

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-26 10:52:08

这里的问题是验证问题,特别是这里的问题:@param.depends('y', watch=True)。在您的示例中,y不是一个参数,因此param.depends无法解决它,并最终返回到依赖于所有参数。我已经提交了一个问题来解决这个这里。如果将示例更改为:

代码语言:javascript
复制
y = param.Series(default=df[pred_target.default])

它将工作,但您仍然有问题,回调被调用两次。这是因为您已经在“依赖”声明中设置了watch=True。设置watch=True只对有副作用的方法有意义,如果您的方法返回值,那么设置它很少有意义。要对此进行扩展,当您将方法传递到面板(例如pn.Row(model_trainer.plot_y) )时,它将自动监视参数,并在参数更改时调用该方法来更新绘图。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58114082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档