【问题标题】:In R shiny when rendering conditional panels in main panel, how to change view when action button is clicked?在主面板中渲染条件面板时在R闪亮中,单击操作按钮时如何更改视图?
【发布时间】:2021-11-16 02:35:33
【问题描述】:

在运行下面的几乎 MWE 代码时,当侧边栏第二个矩阵输入面板被隐藏并且用户通过单击“Rates”操作按钮查看主面板中的值表时,我希望随后单击侧边栏面板中的“显示”操作按钮,除了显示第二个矩阵输入网格的主要作用外,还触发主面板中“绘图”的重新渲染(单选按钮自动切换到“绘图”) .另请参阅下图。

当单击“显示”actionButton 时,我将如何合并此“转到”逻辑?我在条件面板中玩弄 if/else 语句,但还没有运气。

我删除了几个折磨人的插值/输入验证函数(matrixValidate、vectorMulti、vectorMultiFinal)以使这个应用程序完全正常运行,因为它们令人困惑且与问题无关。但是,此发布表单中的应用程序确实可以在主面板中呈现虚拟绘图/表格并说明手头的问题。

MWE 代码:

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

matrix5Default <- function(){vectorBase(60,0.05)}

matrix4Input <- function(x){
  matrixInput(x, 
              value = matrix(c(0.05), 1, 1, dimnames = list(c("Base rate"),NULL)),
              label = "Pre-vector rates (Y variables):",
              rows = list(extend = FALSE,  names = TRUE),
              cols = list(extend = FALSE, names = FALSE, editableNames = FALSE),
              class = "numeric")}

matrix5Input <- function(x,y,z){
  matrixInput(x,
              value = matrix(c(y,z),1,2,dimnames=list(NULL,c("X","Y"))),
              rows = list(extend = TRUE,  names = FALSE),
              cols = list(extend = FALSE, names = TRUE, editableNames = FALSE),
              class = "numeric")}  

vectorBase <- 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(uiOutput("Panels")),
    mainPanel(
      tabsetPanel(
        tabPanel("Rates", value=2,
                 fluidRow(
                   radioButtons(
                     inputId = 'Tab2',
                     label = h5(strong(helpText("Outputs:"))),
                     choices = c('Plot','Rates'), 
                     selected = 'Plot',
                     inline = TRUE)), 
                 conditionalPanel(condition = "input.Tab2 == 'Plot'",plotOutput("plot1")),
                 conditionalPanel(condition = "input.Tab2 == 'Rates'",tableOutput("table1")),
        ),  # close tab panel
        id = "tabselected"
      )
    ) 
  ) 

server <- function(input,output,session)({
  
  periods     <- reactive(input$periods)
  base        <- reactive(input$base)
  ratesInput  <- reactive(input$ratesInput)

  output$Panels <- renderUI({
    tagList( 
      conditionalPanel(
        useShinyjs(),
        condition="input.tabselected==2",
        matrix4Input("base"),
        uiOutput("ratesTotal"),
        helpText("Generate rates vectors:"),
        actionButton('showBtn','Show'),actionButton('hideBtn','Hide'),
        hidden(uiOutput("ratesVectors")),
      )) 
  }) 

  output$ratesVectors <- renderUI({matrix5Input("ratesInput",input$periods,input$base[1,1])})
  
  observeEvent(input$showBtn,{shinyjs::show("ratesVectors")})
  observeEvent(input$hideBtn,{shinyjs::hide("ratesVectors")})
  
  output$plot1 <-renderPlot({plot(matrix5Default())})
  output$table1 <- renderTable({matrix5Default()})
    
  })

shinyApp(ui, server)

【问题讨论】:

  • 再一次,你的应用很难消化。告诉我们哪些内容不适用于您当前的代码会有所帮助。你说“删除它们并让这个应用程序仍然工作需要很多时间。;有时我需要 2 个小时来回复一个闪亮的问题(有时我会赚到0 票,而我为一个明显的 R 问题获得 3 票,但这是另一个故事....)。
  • 好的,我删除了大部分与手头问题无关的功能。该应用程序不会插入 matrix5 输入,也不会运行验证检查,但这些函数对于解决问题不是必需的。

标签: r shiny conditional-statements shiny-reactivity


【解决方案1】:

尝试updateRadioButtons(),如下所示。它对我有用。

  observeEvent(input$showBtn,{
    shinyjs::show("ratesVectors")
    updateRadioButtons(session, "Tab2", selected = "Plot")
  })

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-24
    • 1970-01-01
    • 2016-04-10
    • 2016-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    相关资源
    最近更新 更多