首页 > 解决方案 > 附加到数据框的末尾并在 Shiny 应用程序中显示为表格

问题描述

我正在尝试创建一个非常简单的应用程序,用户可以在其中输入文本字段和数字,将其附加到数据框,然后将数据框显示为表格。我已经完成了 99%,但唯一的问题是新条目正在覆盖旧条目,因此您只能在数据框中获得一行,在显示的表格中获得一行。

这是一个可重现的示例:


library(shiny)
library(DT)

shinyApp(
    ui = navbarPage("Making a dataframe and displaying it",
                    tabPanel("Input",
                             
                             mainPanel(
                                 textInput("text", "Text input", ""),
                                 numericInput("number", "Numeric input", min=1, value = 1),
                                 actionButton("submit", "Submit")
                             )
                             
                    ),
                    tabPanel("The list",
                             DT::dataTableOutput("thelist")
                    )
    ),
    
    server = function(input, output) {
        
        initial <- data.frame("text" = character(), "number" = numeric())
        
        thelist <- eventReactive(input$submit,{rbind(initial,
                             data.frame("text" = input$text, "number" = input$number))
        })
        
        output$thelist = renderDataTable(thelist())
        
    }
)

谢谢!

标签: rshiny

解决方案


您可以将数据框放入reactiveValues并用于observeEvent在单击时添加新行。

library(shiny)
library(DT)

shinyApp(
  ui = navbarPage("Making a dataframe and displaying it",
                  tabPanel("Input",
                           mainPanel(
                             textInput("text", "Text input", ""),
                             numericInput("number", "Numeric input", min=1, value = 1),
                             actionButton("submit", "Submit")
                           )
                           
                  ),
                  tabPanel("The list",
                           DT::dataTableOutput("thelist")
                  )
  ),
  
  server = function(input, output) {
    
    rv <- reactiveValues(data = data.frame(text = character(), number = numeric()))
    
    observeEvent(input$submit,{
      rv$data <- rbind(rv$data, data.frame(text = input$text, number = input$number))
    })
    
    output$thelist = renderDataTable({
      rv$data
      })
    
  }
)

推荐阅读