Shiny应用中conditionalPanel与tabsetPanel显示异常问题求助
我找到了你的问题所在!当你切换到「Assumptions and Scenarios」主标签页时,「Transport results」下的子tabsetPanel(id="tabs_c")并没有重置它的输入值——它默认保留着第一个子标签的value t_cara。Shiny不会自动清空未显示的tabset的状态,所以此时input.tabs_c == 't_cara'这个条件依然成立,导致「Car aggregate」的侧边栏内容也跟着显示出来了。
修复方案
我们需要给每个侧边栏的conditionalPanel加上主标签页是否激活的判断,确保只有当前主标签页对应的子tab条件才会生效。具体步骤如下:
- 给最外层的
tabsetPanel添加一个id,用来跟踪当前激活的主标签页 - 为每个侧边栏条件增加主标签页的判断逻辑
修复后的完整代码
ui <- fluidPage( sidebarLayout( sidebarPanel( conditionalPanel( # 新增主tab判断:只有在「Assumptions and Scenarios」主tab激活时才显示 condition = "input.main_tabs == 'assumptions_tab' && input.tabs_a == 't_ass'", h4("Assumptions") ), conditionalPanel( # 新增主tab判断:只有在「Transport results」主tab激活时才显示 condition = "input.main_tabs == 'transport_tab' && input.tabs_c == 't_cara'", h4("Car aggregate") ), # End conditionalPanel conditionalPanel( condition = "input.main_tabs == 'transport_tab' && input.tabs_c == 't_carf'", h4("Car fuel") ), # End conditionalPanel conditionalPanel( condition = "input.main_tabs == 'transport_tab' && input.tabs_c == 't_carfp'", h4("Car fuel power:") ) # End conditionalPanel ), # End sidebarPanel mainPanel( # 给最外层tabset添加id:main_tabs,用来跟踪当前主tab tabsetPanel( type = "tabs", id = "main_tabs", tabPanel( "Assumptions and Scenarios", # 给主tab设置value,方便条件判断 value = "assumptions_tab", tabsetPanel( type = "tabs", id = "tabs_a", tabPanel( "Assumptions", value = "t_ass" ), # Close tabpanel t_ass, tabPanel( "Scenarios", value = "t_scen" ) # Close tabpanel t_scen ) # Close tabsetpanel ), # Close tabPanel t_Ass tabPanel( "Transport results", # 给主tab设置value value = "transport_tab", tabsetPanel( type = "tabs", id = "tabs_c", tabPanel( "Cars: Aggregated", value = "t_cara" ), # Close tabpanel t_cara tabPanel( "Cars: Fuel", value = "t_carf" ), # Close tabpanel tabPanel( "Cars: Fuel vs Power", value = "t_carfp" ) # Close tabpanel t_carfp ) # Close tabset tabs_c ) # Close tabpanel Transport results ) # Close tabset main_tabs ) # End mainPanel ) # End sidebarLayout ) # End fluidPage server <- function(input, output) { } shinyApp(ui = ui, server = server)
关键修改说明
- 最外层的
tabsetPanel新增了id = "main_tabs",并给两个主标签页分别设置了value(assumptions_tab和transport_tab),这样我们可以准确判断当前激活的主标签页 - 每个侧边栏的
conditionalPanel都增加了主标签页的判断逻辑,比如input.main_tabs == 'assumptions_tab',确保只有在对应的主标签页激活时,子tab的条件才会被评估 - 移除了子tabPanel中多余的
id属性(原t_carfp的tabPanel里重复设置了id,Shiny的tabPanel不需要单独设置id,value已经足够)
现在运行修改后的代码,点击「Assumptions」标签时,侧边栏只会显示「Assumptions」,不会再出现「Car aggregate」了!
内容的提问来源于stack exchange,提问作者arnyeinstein
相关产品推荐
相关产品推荐

