You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shiny for Python:nav()需置于navset_*()容器内的报错修复求助

解决Shiny for Python中nav()容器报错问题

报错原因

你的代码存在括号不匹配问题:第一个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 00:46:31