Shiny for Python:nav()需置于navset_*()容器内的报错修复求助
报错原因
你的代码存在括号不匹配问题:第一个ui.nav的闭合括号缺失,导致第二个ui.nav没有被正确包含在navset_tab()容器内,触发NotImplementedError。此外代码还有两处不符合Shiny开发逻辑的问题:
- 两个标签页使用了相同
id="cell_line"的输入控件,Shiny要求页面内控件id必须唯一 - UI中直接调用绘图函数生成图表,不符合Shiny响应式渲染的机制,无法实现筛选数据联动
修正后的完整代码
import plotly.express as px from shiny import ui, App, render, reactive from shinywidgets import output_widget, render_widget import pandas as pd from DT import DT # 假设以下变量已提前定义 # cell_lines = ["CTR-M2-O5", ...] # fold_changes = "your_y_column_name" # df = pd.DataFrame(...) def create_scatter_plot(data, x_var, y_var, **kwargs): fig = px.scatter(data, x=x_var, y=y_var, **kwargs) return fig app_ui = ui.page_fluid( ui.navset_tab( # 标签页1:带筛选器的表格 ui.nav( "Table", ui.layout_sidebar( ui.panel_sidebar( ui.input_selectize( id="cell_line", label="Cell Line", choices=cell_lines, selected='CTR-M2-O5', multiple=True ) ), ui.panel_main( ui.h3("Raw Data"), ui.output_ui("filtered_table") ) ) ), # 标签页2:基于筛选数据的图表 ui.nav( "Plot", ui.layout_sidebar( # 如需共用筛选条件,可直接复用id="cell_line",此处为示例保留独立控件 ui.panel_sidebar( ui.input_selectize( id="cell_line_plot", label="Cell Line", choices=cell_lines, selected='CTR-M2-O5', multiple=True ) ), ui.panel_main( ui.h3("Scatter Plot"), output_widget("scatter_plot") ) ) ) ) ) def server(input, output, session): # 响应式处理表格筛选数据 @reactive.Calc def filtered_data(): selected = input.cell_line() return df[df["cell_line"].isin(selected)] if selected else df # 响应式处理图表筛选数据 @reactive.Calc def filtered_data_plot(): selected = input.cell_line_plot() return df[df["cell_line"].isin(selected)] if selected else df # 渲染筛选后的表格 @output @render.ui def filtered_table(): return ui.HTML( DT(filtered_data(), classes="display nowrap compact", column_filters="footer") ) # 渲染联动图表 @output @render_widget def scatter_plot(): return create_scatter_plot( filtered_data_plot(), x_var="cell_line", # 替换为实际的x轴列名 y_var=fold_changes ) app = App(app_ui, server)
关键修改点
- 修复括号结构:为第一个
ui.nav补充闭合括号,确保两个nav组件都被包裹在navset_tab容器内 - 保证控件id唯一:将图表标签页的筛选控件id改为
cell_line_plot,避免冲突 - 采用响应式渲染:通过
reactive.Calc处理数据筛选逻辑,用render.ui和render_widget实现表格、图表的动态更新 - 规范标签页语法:直接用字符串作为
ui.nav的标题参数,替代ui.panel_title,符合Shiny官方语法规范
内容的提问来源于stack exchange,提问作者Neophytos Kouphou
相关产品推荐
相关产品推荐

