如何使用 R shiny 中的观察事件或其他反应函数更改 table 列 headers?

How to change table column headers using an Observe Event or other reactive function in R shiny?

下面的 MWE 代码工作正常,除了我想在用户单击“修改”操作按钮时将输出 table 列 headers 更改为按顺序排列的描述符,如图所示在底部的图像中。

在导出图像的输出时,我 运行 下面的 MWE 代码,单击“修改”操作按钮,然后在弹出的模式对话框中插入额外的 2 和 3 列进入顶部的输入矩阵。在下面显示的模态框底部呈现的那个小 table1 中(基本上是模态框顶部矩阵输入框的镜像),我想要列 headers如镜像所显示,自动地和顺序地生成。我想从模态对话框中呈现的这个 table1 开始,一旦弄清楚列 header 标记技术,我将把它添加到应用程序中呈现的其他 tables .

基本上,我只想在输出 tables 中将“V”替换为“Series”。

我还检查了 renderTable 的规格,希望有一个可以将 V 更改为其他内容的键,但我什么也没找到。

我错误地认为使用 observeEvent 和反应性很容易做到这一点,但我无法让它工作。毕竟,当 运行 我在 R studio 控制台(没有 Shiny)中使用下面的简单代码行时,它会改变 table 输出 headers 就好了——但我没有知道如何反应性地将其合并到 Shiny 中:

> default_mat <- matrix(c(1,24,0,1),4,1,dimnames=list(c("A","B","C","D"),NULL))
> colnames(default_mat) <- paste0("Series ", 1:ncol(default_mat))
> default_mat

这是我尝试将以上内容(概念上)拉入的 MWE 代码:

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

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

colnames(default_mat) <- paste0("Series ", 1:ncol(default_mat))

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,
                       colHeader = colnames(input)
        ) # close reactive values
  
  hide("table2")
  
  observeEvent(input$modify,{
    showModal(modalDialog(
      rv$mat,
      tableOutput("table1"))
    ) # close show modal and modal dialog
    hide("table2")
  }) # close observe event
  
  output$table1 <- renderTable({
    rv$mat <- matrix3Input("matrix", input$matrix)
    rv$input <- input$matrix
    input$matrix
  }, rownames = TRUE, colnames = 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)
  }) # close observe event
  
  output$table2 <- renderTable({
    rv$input
  }, rownames = TRUE)
  
} # close server

shinyApp(ui, server)

试试这个

output$table1 <- renderTable({
    rv$mat <- matrix3Input("matrix", input$matrix)
    # rv$input <- input$matrix
    # input$matrix
    df1 <- input$matrix
    n <- dim(df1)[2]
    colnames(df1) <- paste("Series", 1:n)
    rv$input <- df1
    df1
  }, rownames = TRUE, colnames = TRUE)