在这个 R Shiny 反应链中,是什么允许将用户输入网格更改为 "stick" 左右?

In this R Shiny reactivity chain, what is it that allows a change in the user input grid to "stick" around?

在下面运行的 MWE 代码中,反应链中到底是什么允许用户对矩阵输入网格的输入修改从一次单击“修改”操作按钮一直持续到下一次单击?

运行 代码。单击“修改”操作按钮,对模态对话框中弹出的用户输入网格进行更改(更改为默认值或插入新列),您会注意到更改立即出现在 table 在侧边栏面板中。当您关闭模态对话框时,更改会保留在侧边栏面板中呈现的 table 中。当您再次单击“修改”按钮时,您会看到这些更改仍反映在用户输入网格中。效果很好。我需要在其他地方做同样的事情,但我无法理解它是如何工作的!

我正在尝试完全理解这一点,以便我可以在另一段代码中重复此功能。

MWE 代码:

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

# Function assigns row headers to input matrix grid
  matrix3Headers <- function(){c('A','B','C','D')}

# Assigns default values to first column of input matrix grid
  matrix3Default <- matrix(c(1,24,0,100),4,1,dimnames=list(matrix3Headers(),NULL))

# Automatically assigns names to column headers
  colnames(matrix3Default) <- paste0("Series ",1:ncol(matrix3Default))

# Matrix input function
  matrix3Input <- function(x, matrix3Default){
    matrixInput(x,
                label =  'Input series terms into below grid:',
                value =  matrix3Default, 
                rows  =  list(extend=FALSE,names=TRUE), 
                cols  =  list(extend=TRUE,names=TRUE,editableNames=FALSE,delete=TRUE),
                class =  'numeric'
      ) # close matrix input
  } # close function

ui <- fluidPage(
    useShinyjs(),
    titlePanel('Inputs'),
    fluidRow(actionButton('modify','Modify'),tableOutput('table2'))
  ) # close fluid page

server <- function(input, output, session){
  
  rv <- reactiveValues(
          mat3=matrix3Input('matrix3',matrix3Default),
          input=matrix3Default,
          colHeader = colnames(input)
        ) # close reactive values
  
  observeEvent(input$modify,{
    showModal(modalDialog(
      rv$mat3,
    )) # close shown modal and modal dialog
  }) # close observe event
  
  output$table2 <- renderTable({
    req(input$matrix3)
    rv$mat3 <- matrix3Input('matrix3',input$matrix3)
    
    if(!is.null(input$modify)) {
      df <- input$matrix3
      n <- dim(df)[2]
      rownames(df) <- matrix3Headers()
      
      rv$input <- df
      colnames(df) <- paste("Series", 1:n)
      df
    }
  }, colnames=TRUE) # close output$table2
  

  } # close server

shinyApp(ui, server)

req(input$matrix3) 使 table2 的呈现(以及以下代码的执行)等到 input$matrix3 被创建。

单击 修改 actionButton 时,showModal 被触发,这要归功于 observeEvent 观察来自 input$modify 的输入按钮。

在模态视图中必须显示rv$mat3,从而调用rv reactiveValues 的执行,从而调用matrix3Input() 函数的执行。这会触发 input$matrix3.

的创建

创建后,可以执行 req(input$matrix3) 下的代码,从而呈现 df table(同时模态框仍处于打开状态)。由于反应性,对模态框中矩阵的任何实时修改都会反映到呈现的 table2(模态框下方),并存储在 rv$mat3 reactiveValues()(带有 rv$mat3 <- matrix3Input('matrix3',input$matrix3)行)。

点击 dismiss 按钮不会触发任何关于存储矩阵或呈现的矩阵 table,只会关闭模态框。

当你再次点击修改actionButton时,你只是再次调用存储rv$mat3的显示,依此类推。