如何使用操作按钮在 R Shiny 中显示和隐藏表格输出?

Posted

技术标签:

【中文标题】如何使用操作按钮在 R Shiny 中显示和隐藏表格输出?【英文标题】:How to use action buttons to show and hide table output in R shiny? 【发布时间】:2021-10-06 12:30:13 【问题描述】:

在下面的简单 App 代码中,我在 Shiny 模态对话框中生成了一个用户输入表(或矩阵)。单击“修改”操作按钮会拉出一个默认用户输入表,用户可以在其中修改默认值、插入/删除输入列等。“显示”操作按钮在主页上拉出table2,“隐藏”隐藏同一张桌子。 (您可以忽略模态框中出现的table1,它暂时存在用于测试目的,稍后将被删除)。 “重置”按钮将表格恢复为默认表格。

问题是“显示”和“隐藏”只能工作一次。此外,在修改输入表(或矩阵)后,单击“修改”会拉出默认表,而不是最近修改的表。

那么,我将如何修改以下内容,以便(i)单击“显示”和“隐藏”分别重复显示和隐藏最近修改的表格(确定也有一个组合显示/隐藏按钮,使用 shinyjs @ 987654323@ 函数,我玩过的东西),(ii)在第一次调用应用程序时单击“修改”会拉出默认表(如当前所做的那样),但随后单击“修改”会拉出最近修改的表, 以及 (iii) 在没有先修改表格的情况下点击“显示”会拉出默认表格?

MWE 代码:

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

matrix3Input <- function(x)
  matrixInput(x, 
              label = 'Series terms:',
              value = matrix(c(1,24,0,1),4,1,dimnames=list(c("A","B","C","D"),NULL)), 
              rows = list(extend = FALSE,names = TRUE), 
              cols = list(extend = TRUE,names = TRUE,editableNames = TRUE,delete = TRUE),
              class = "numeric") # close matrix input
 # close function

ui <- fluidPage(
  useShinyjs(),
  titlePanel("Inputs"),
  fluidRow(actionButton("modify","Modify"),
           actionButton("show","Show"),
           actionButton("hide","Hide"),
           actionButton("reset","Reset"),
           tableOutput("table2")
  ) # close fluid row
) # close fluid page

server <- function(input, output, session) 
  
  observeEvent(input$modify,showModal(modalDialog(
    matrix3Input("matrix"),
    tableOutput("table1"))
    ))
  
  output$table1 <- renderTable(input$matrix, rownames = TRUE)
  
  observeEvent(input$show,
    tableOutput("table2")
    output$table2 <- renderTable(input$matrix, rownames = TRUE)
  )
  
  observeEvent(input$hide,hide("table2"))
  
  observeEvent(input$reset,
    tableOutput("table2")
    output$table2 <- renderTable(input$matrix, rownames = TRUE)
  )
  
 # close server

shinyApp(ui, server)

【问题讨论】:

【参考方案1】:

我认为这应该涵盖所有不同的场景。

我用reactiveValues保存matrix3Input和矩阵。

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


default_mat <- matrix(c(1,24,0,1),4,1,dimnames=list(c("A","B","C","D"),NULL))

matrix3Input <- function(x, default_mat)
  matrixInput(x, 
              label = 'Series terms:',
              value = default_mat, 
              rows = list(extend = FALSE,names = TRUE), 
              cols = list(extend = TRUE,names = TRUE,editableNames = TRUE,delete = TRUE),
              class = "numeric") # close matrix input
 # close function

ui <- fluidPage(
  useShinyjs(),
  titlePanel("Inputs"),
  fluidRow(actionButton("modify","Modify"),
           actionButton("show","Show"),
           actionButton("hide","Hide"),
           actionButton("reset","Reset"),
           tableOutput("table2")
  ) # close fluid row
) # close fluid page

server <- function(input, output, session) 
  
  rv <- reactiveValues(mat = matrix3Input("matrix", default_mat), input = default_mat)
  hide("table2")
  
  observeEvent(input$modify,
    showModal(modalDialog(
      rv$mat,
      tableOutput("table1"))
    )
    hide("table2")
  )
  
  output$table1 <- renderTable(
    rv$mat <- matrix3Input("matrix", input$matrix)
    rv$input <- input$matrix
    input$matrix
    , rownames = TRUE)
  
  observeEvent(input$show,
    show("table2")
  )
  
  observeEvent(input$hide, hide("table2"))
  
  observeEvent(input$reset,
    hide("table2")
    rv$input <- default_mat
    rv$mat <- matrix3Input("matrix", default_mat)
  )
  
  output$table2 <- renderTable(
    rv$input
    , rownames = TRUE)
  
 # close server

shinyApp(ui, server)

【讨论】:

您好 Ronak,当我运行您的代码时,当我单击“显示”按钮时,table2 没有出现。每次单击“显示”时,唯一发生的情况是在 R Studio 控制台中返回以下内容: Listening on 127.0.0.1:6025 [1] "table2" 刚刚再次检查了新的 R 会话。它对我来说很好,可以正确显示/隐藏/重置。不知道你最后可能出了什么问题。 是的,重启 R 就成功了。效果很好。我会研究你的修复。谢谢你罗纳克! 知道如何在更改 selectioninput 或 actionButton 后隐藏呈现的表格吗?

以上是关于如何使用操作按钮在 R Shiny 中显示和隐藏表格输出?的主要内容,如果未能解决你的问题,请参考以下文章

r 在Shiny中隐藏和显示元素

如何根据 R Shiny 中的单选按钮显示输出?

在 Shiny 中显示/隐藏 bsCollapse 面板

在 R Shiny 中,如何使用 actionButton 重置 rhandsontable 中的数据(反转所有手动输入)?

基于选项卡面板选择在 R Shiny 中显示/隐藏 selectinput

R Shiny:在 ObserveEvent 中更新代理表列标题