为了账号安全,请及时绑定邮箱和手机立即绑定

当我更改不应触发任何更新的按钮设置时,为什么我的绘图会被面板更新(两次)?(面板霍洛维兹)

当我更改不应触发任何更新的按钮设置时,为什么我的绘图会被面板更新(两次)?(面板霍洛维兹)

MMTTMM 2022-06-07 17:57:11
我开设了一个课程来探索和训练模型。当我在下面的代码示例中更改下拉菜单“choose_model_type”的值时,我希望仪表板中没有任何变化,因为@param.depends('choose_model_type', watch=True)我的类中没有。但是,当我更改下拉菜单“choose_model_type”的值时,我的仪表板会更新。在这种情况下,如果我查看日志,函数 plot_y() 会被触发两次:2019-09-26 11:24:42,802 开始 plot_y2019-09-26 11:24:42,825 开始 plot_y这对我来说是意想不到的行为。我不希望在更改“choose_model_type”时触发 plot_y()。我如何确保仅在“y”更改(并且我的绘图在仪表板中更新)而不是其他参数(例如下拉菜单)更改时才触发 plot_y?我想控制什么时候触发,但对我来说似乎有一些魔法正在发生。其他相关问题是:为什么 plot_y() 被触发两次?如果我更改 'pred_target' 它也会触发 plot_y() 两次。当我更改“choose_model_type”的值时也会发生同样的情况:plot_y() 被触发两次。# library imports    import loggingimport numpy as npimport pandas as pdimport hvplotimport hvplot.pandasimport holoviews as hvfrom holoviews.operation.datashader import datashade, dynspreadhv.extension('bokeh', logo=False)import panel as pnimport param# create some sample datadf = pd.DataFrame(np.random.choice(100, size=[50, 2]), columns=['TARGET1', 'TARGET2'])# class to train my models with some settingsclass 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_plotmodel_trainer = ModelTrainer()
查看完整描述

1 回答

?
德玛西亚99

TA贡献1770条经验 获得超3个赞

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

y = param.Series(default=df[pred_target.default])

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


查看完整回答
反对 回复 2022-06-07
  • 1 回答
  • 0 关注
  • 148 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号