在 R Shiny 中,如何在模态对话框中反应性地重置用户输入?

In R Shiny, how to reactively reset user inputs inside a modal dialogue box?

下面的 MWE 代码按预期工作,除了我想单击模态对话框中的“重置”操作按钮以使模态对话框中的矩阵输入网格立即(反应性地)重置为默认值(对象 matrix3Default) 和主面板中渲染的 table 也立即(反应性地)重置为默认值(对象 matrix3Default)。

按照草案,单击“重置”后,矩阵输入网格和在主面板中呈现的 table 仅在用户单击侧边栏面板中的“修改...”操作按钮后才重新呈现.

当用户点击“重置”时,如何让“重置”按钮立即响应?

我未成功尝试执行此操作在下面的“BELOW ATTEMPT...”下显示

当 运行 出现这种情况时,将 changes/additions 设为用户输入网格,这样您就可以看到它是如何重置的。

MWE 代码:

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

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

matrix3Default <- matrix(c(1,24,0,100),4,1,dimnames=list(matrix3Headers(), NULL))

matrix3Headers <- function(){c('A','B','C','D')}

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')}

ui <- 
  pageWithSidebar(
    headerPanel("Model..."),
    sidebarPanel(
      fluidRow(helpText(h5(strong("Base Input Panel")))), 
      uiOutput("Panels") 
    ), # close sidebar panel
    
    mainPanel(
      tabsetPanel(
        tabPanel("Liabilities module", value=4,
                 fluidRow(h5(strong(helpText("Select model output to view:")))),
                 fluidRow(actionButton('showLiabStructBtn','Liabilities')),
                 div(style = "margin-top: 5px"),
                 uiOutput('showResults')), 
        id = "tabselected"
      ) # close tabset panel
    ) # close main panel
  ) # close page with sidebar

server <- function(input,output,session)({
  
  showResults <- reactiveValues()
  rv          <- reactiveValues( 
    mat3      =  matrix3Input('matrix3',matrix3Default),
    input     =  matrix3Default,
    colHeader =  colnames(input))
  
  output$Panels <- renderUI({
    tagList( 
      conditionalPanel(
        condition="input.tabselected==4",
        actionButton('modLiabStruct','Modify Liabilities Structure'))
    ) # close tagList
  }) # close renderUI
  
  vectorLiabStruct <- reactive({
    if(!isTruthy(input$modLiabStruct)){ 
      df <- matrix3Default
      df
      n <- dim(df)[2]
      colnames(df) <- paste("Series", 1:n)
      rownames(df) <- matrix3Headers()
    }
    else{ 
      req(input$matrix3) 
      rv$mat3 <- matrix3Input('matrix3',input$matrix3) 
      df <- input$matrix3
      n <- dim(df)[2]
      colnames(df) <- paste("Series", 1:n)
      rownames(df) <- matrix3Headers()
      rv$input <- df
    } # close else
    df})
  
  output$table3 <- renderTable({
    if(!isTruthy(input$modLiabStruct)){ 
      df <- matrix3Default
      df
      n <- dim(df)[2]
      colnames(df) <- paste("Series", 1:n)
      rownames(df) <- matrix3Headers()
    }
    else{ 
      req(input$matrix3) 
      rv$mat3 <- matrix3Input('matrix3',input$matrix3) 
      df <- input$matrix3
      n <- dim(df)[2]
      colnames(df) <- paste("Series", 1:n)
      rownames(df) <- matrix3Headers()
      rv$input <- df
    } # close else
    df},rownames=TRUE, colnames=TRUE)
  
  observeEvent(input$modLiabStruct,{ 
    showModal(modalDialog( 
      rv$mat3,
      footer = tagList(
        actionButton("resetLiabStruct","Reset"), 
        modalButton("Close")
      ), # close tag list
    )) # close show modal and modal dialog
  }) # close observe event
  
  observeEvent(input$showLiabStructBtn,{showResults$showme<-tagList(tableOutput("table3"))},ignoreNULL=FALSE)  
  
  # BELOW ATTEMPT...
  observeEvent(input$resetLiabStruct,{
    rv$input <- matrix3Default
    rv$mat3  <- matrix3Input('matrix3',matrix3Default)
    {showResults$showme <- tagList(tableOutput("table3"))}
  },ignoreNULL = TRUE) # close observe event

  output$showResults <- renderUI({showResults$showme})
}) # close server

shinyApp(ui, server)

您之所以会出现此行为,是因为一旦您的第一个 observeEvent() (input$modLiabStruct) 加载,模式框中显示的 matrix3 不会自行刷新。

因为它是 matrixInput,您需要使用 updateInput 类型的函数更新它,幸运的是它是 provided by the shinyMatrix package。您可以按如下方式修改您的observeEvent

observeEvent(input$resetLiabStruct, {
    updateMatrixInput(session, 'matrix3', matrix3Default)
  })