R Shiny中点击action button后如何触发UI层conditional panel切换显示
解决方法
你的核心需求可以通过Shiny自带的updateRadioButtons函数实现,Conditional Panel的显示逻辑完全绑定主面板顶部单选按钮mainPanelBtnTab4的取值,你只需要在点击侧边栏按钮时主动更新这个输入值即可,无需修改UI层代码。
具体修改点
- 替换
observeEvent(input$modLiab)中你标记# ???的无效代码,新增单选按钮更新逻辑:
observeEvent(input$modLiab,{ showModal(modalDialog(rv3$mat3,footer=tagList(actionButton("resetLiab","Reset"),modalButton("Close")))) # 新增以下代码,主动切换单选按钮选中值 updateRadioButtons(session, inputId = "mainPanelBtnTab4", selected = "Liabilities") })
- 在
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
相关产品推荐
相关产品推荐

