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

R Shiny中点击action button后如何触发UI层conditional panel切换显示

解决方法

你的核心需求可以通过Shiny自带的updateRadioButtons函数实现,Conditional Panel的显示逻辑完全绑定主面板顶部单选按钮mainPanelBtnTab4的取值,你只需要在点击侧边栏按钮时主动更新这个输入值即可,无需修改UI层代码。

具体修改点

  1. 替换observeEvent(input$modLiab)中你标记# ???的无效代码,新增单选按钮更新逻辑:
observeEvent(input$modLiab,{ 
  showModal(modalDialog(rv3$mat3,footer=tagList(actionButton("resetLiab","Reset"),modalButton("Close"))))
  # 新增以下代码,主动切换单选按钮选中值
  updateRadioButtons(session, inputId = "mainPanelBtnTab4", selected = "Liabilities")
})
  1. 在observeEvent(input$modRates)中新增对应更新逻辑,注意需要判断当前是否处于「Liabilities module」标签页,避免在利率标签页操作时报错:
observeEvent(input$modRates,{
  showModal(modalDialog(
    matrix4Input("matrix4",if(is.null(input$matrix4)) matrix4Default else input$matrix4),
    useShinyjs(),
    footer = tagList(actionButton("resetRates","Reset"),modalButton("Close"))
  ))
  # 新增以下代码,处于负债模块页时主动切换单选按钮选中值
  if(input$tabselected == 4){
    updateRadioButtons(session, inputId = "mainPanelBtnTab4", selected = "Rates values")
  }
})

完整可运行代码

library(shiny);library(shinyMatrix);library(shinyjs)

mainPanelBtns <- function(x,y,z){radioButtons(inputId=x,label="Model view:",choices= y,selected=z,inline=TRUE)}
matrix3Default <- matrix(c(1,24,0,100), 4, 1,dimnames=list(c('A','B','C','D')))
matrix3Input <- function(x, matrix3Default){matrixInput(x,label='Input:',value=matrix3Default,class= 'numeric')} 
matrix3RowHeaders <- function(){c('A','B','C','D')}
matrix4Default <- matrix(c(0.2), 4, 1,dimnames=list(c("A","B","C","D"),NULL))
matrix4Input <- function(x,matrix4Input){matrixInput(x,value = matrix4Input,class = "numeric")}
vectorBaseRate <- function(x,y){
  a <- rep(y,x)
  b <- seq(1:x)
  c <- data.frame(x = b, y = a)
  return(c)}

ui <- 
  pageWithSidebar(
    headerPanel("Model..."),
    sidebarPanel(
      fluidRow("Base Input Panel"),
      conditionalPanel(condition="input.tabselected==4",actionButton('modLiab','Mod Liaby')),
      conditionalPanel(condition="input.tabselected==4||input.tabselected==5",actionButton('modRates','Mod Rate'))
    ),
    mainPanel(
      tabsetPanel(
        tabPanel("Liabilities module", value=4,
                 mainPanelBtns('mainPanelBtnTab4',c('Liabilities','Rates values'),'Liabilities'),
                 conditionalPanel(condition = "input.mainPanelBtnTab4 == 'Liabilities'", tableOutput("table3")),
                 conditionalPanel(condition = "input.mainPanelBtnTab4 == 'Rates values'", tableOutput("table4"))
        ),
        tabPanel("Interest rates", value=5,
                 mainPanelBtns('mainPanelBtnTab5',c('Rates values'),'Rates values'), 
                 conditionalPanel(condition = "input.mainPanelBtnTab5 == 'Rates values'", tableOutput("table5"))
        ),
        id = "tabselected"
      )))

server <- function(input,output,session)({
  
  rv3        <- reactiveValues(
    mat3      = matrix3Input('matrix3',matrix3Default),
    input     = matrix3Default
  )
  
  matrix4   <- reactive(input$matrix4)
  baseRate  <- function(){vectorBaseRate(60,input$matrix4[1,1])} 
  
  vectorLiabStruct <- reactive({
    if(!isTruthy(input$modLiab)){ 
      df <- matrix3Default
      rownames(df) <- matrix3RowHeaders()}
    else{ 
      req(input$matrix3) 
      rv3$mat3 <- matrix3Input('matrix3',input$matrix3) 
      df <- input$matrix3
      rownames(df) <- matrix3RowHeaders()
      rv3$input <- df
    }
    df})
  
  output$table3 <- renderTable({
    if(!isTruthy(input$modLiab)){ 
      df <- matrix3Default
      rownames(df) <- matrix3RowHeaders()}
    else{ 
      req(input$matrix3) 
      rv3$mat3 <- matrix3Input('matrix3',input$matrix3) 
      df <- input$matrix3
      rownames(df) <- matrix3RowHeaders()
      rv3$input <- df
    }
    df},rownames=TRUE, colnames=TRUE) 
  
  vectorRates <- reactive({
    if (is.null(input$modRates)){df <- NULL}
    else {
      if(input$modRates < 1){df <- cbind(Period = 1:60,BaseRate = 0.2)}
      else {
        req(input$matrix4)
        df <- cbind(Period = 1:60,BaseRate = baseRate()[,2])
      }
    }
    df}) 
  
  observeEvent(input$modLiab,{ 
    showModal(modalDialog(rv3$mat3,footer=tagList(actionButton("resetLiab","Reset"),modalButton("Close"))))
    updateRadioButtons(session, inputId = "mainPanelBtnTab4", selected = "Liabilities")
  })
  
  observeEvent(input$resetLiab, {updateMatrixInput(session,'matrix3', matrix3Default)})
  observeEvent(input$resetRates, {updateMatrixInput(session,'matrix4', matrix4Default)})
  
  output$table5<-output$table4<-renderTable({vectorRates()})
  
  observeEvent(input$modRates,{
    showModal(modalDialog(
      matrix4Input("matrix4",if(is.null(input$matrix4)) matrix4Default else input$matrix4),
      useShinyjs(),
      footer = tagList(actionButton("resetRates","Reset"),modalButton("Close"))
    ))
    if(input$tabselected == 4){
      updateRadioButtons(session, inputId = "mainPanelBtnTab4", selected = "Rates values")
    }
  })
  
})

shinyApp(ui, server)

内容的提问来源于stack exchange,提问作者Curious Jorge - user9788072

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 02:30:00