在R闪亮App中,第一次调用App时如何渲染默认表?

人气:258 发布:2022-10-16 标签: r modal-dialog render shiny shiny-reactivity

问题描述

下面的MWE代码运行良好,只是在第一次调用App时,默认表不会像应有的那样呈现在侧边栏面板中。

仅在单击该侧栏面板中的修改操作按钮后才会呈现默认表。在单击修改操作按钮之前,我在侧边栏面板中收到以下错误消息:&is.Matrix(Value)is Not True&Quot;。

那么,如何在调用应用程序时正确呈现默认表?

请注意,在单击修改操作按钮并对模式对话框中弹出的矩阵输入网格进行任何更改后,这些更改会立即反映在侧边栏面板中出现的表格中,并且当用户关闭模式对话框并再次单击修改时,这些更改会立即反映在表格中。这是一项运行良好的重要功能。

是的,我在8月24日发布了一个类似的问题,询问更复杂的代码部分,但在这个示例中实现它时遇到了问题。我已尝试通过以下方式实施此解决方案:

df <- if(is.null(input$modify)){df >- NULL}
          else{input$matrix3}

在下面的MWE代码中,以及其他地方,包括内部reactiveValues,但还没有运气。希望如果有人再次指导我完成此解决方案,它会支持我!

弄清楚这一点后,我将发布更正后的代码,询问反应链中究竟是什么允许对矩阵输入网格的修改从&q;修改&q;操作按钮的一次单击一直到下一次单击。我正在尝试在另一段代码中重复此功能。

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({
    rv$mat3 <- matrix3Input('matrix3',input$matrix3)
    
    df <- if(is.null(input$modify)){df >- NULL}
          else{input$matrix3}
    
    n <- dim(df)[2]
    rownames(df) <- matrix3Headers()
    
    rv$input <- df
    colnames(df) <- paste("Series", 1:n)
    df},rownames=TRUE, colnames=TRUE) # close output$table1
  
  } # close server

shinyApp(ui, server)

推荐答案

您可以检查NULL中的NULL值,以便代码仅在input$matrix3存在时运行。除此之外,您还可以进一步简化逻辑,使代码仅在!is.null(input$modify)

时运行
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({
    if(is.null(input$matrix3)) return(matrix3Default)
    rv$mat3 <- matrix3Input('matrix3',input$matrix3)
    
    df <- input$matrix3
    if(!is.null(input$modify)) {
      n <- dim(df)[2]
      rownames(df) <- matrix3Headers()
      
      rv$input <- df
      colnames(df) <- paste("Series", 1:n)
    }
    df
  }, colnames=TRUE) # close output$table1
  
} # close server

shinyApp(ui, server)

ps->-不是R中的有效运算符

540