【问题标题】:In R Shiny App, how to render a default table when first invoking the App?在 R Shiny App 中,如何在首次调用 App 时呈现默认表格?
【发布时间】:2021-10-27 22:11:34
【问题描述】:

下面的 MWE 代码可以正常工作,除了在第一次调用应用程序时,默认表格没有按应有的方式呈现在侧边栏面板中。

仅在单击侧边栏面板中的“修改”操作按钮后才会呈现默认表格。在单击“修改”操作按钮之前,我在侧边栏面板中收到以下错误消息:“is.matrix(value) is not TRUE”。

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

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

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

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

在下面的 MWE 代码中,以及在包括 reactiveValues 在内的其他位置中,但还没有运气。希望如果有人再一次指导我完成这个解决方案,它会“坚持”我!

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

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)

【问题讨论】:

    标签: r shiny modal-dialog render shiny-reactivity


    【解决方案1】:

    您可以检查renderTable 中的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 - &gt;- 不是 R 中的有效运算符。

    【讨论】:

    • 嗨罗纳克,一切都清楚。但是,如何修改它,以便在首次调用应用程序时默认表出现在侧边栏面板中?目前,它仅在单击“修改”操作按钮后出现。
    【解决方案2】:

    您在测试input$modify 是否存在之前调用matrix3Input(),因此您收到错误is.matrix(value) is not TRUE,因为input$matrix3 尚不存在。

    如果您在调用 matrix3Input() 函数之前移动测试,则您的 is.null(input$modify) 始终为 FALSE,您必须使用 isTruthy() 函数在 Shiny 中测试输入。使用 print() 函数检查您正在测试的值,例如print(is.null(input$modify).

    这是一个工作示例:

      output$table2 <- renderTable({
        
        if(!isTruthy(input$modify)){df <- matrix3Default}
        else{
        req(input$matrix3)
        rv$mat3 <- matrix3Input('matrix3',input$matrix3)
        df <- 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$table2
    

    此示例显示的矩阵的默认值取自 matrix3Default(正如您在标题中所要求的那样),如果您不想初始显示表格,只需将 df &lt;- matrix3Default 替换为 df &lt;- NULL

    【讨论】:

    • 您好 julien.leroux5,谢谢。效果很好,你的解释对我“学习”很有帮助。但是,在运行此命令时,我在 R Studio 控制台中收到以下消息:“警告:matrixInput 中的错误:is.matrix(value) is not TRUE...”。你知道如何消除这种情况吗?
    • 啊,是的,因为在创建rv 表达式时,reactiveValues 函数调用了matrix3Input() 函数,而input$matrix3 又不存在了。只需将df &lt;- rv$input 替换为df &lt;- matrix3Default (正如我编辑我的答案)。
    • 点击按钮时出现同样的错误,所以我还添加了一个req(input$matrix3) 行,所以它正在等待这个输入出现。
    猜你喜欢
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-26
    • 2021-12-24
    • 1970-01-01
    • 2017-11-15
    • 2016-05-20
    相关资源
    最近更新 更多