Add values to a reactive table in shiny
I want users of my shiny app to be able to add elements to a table iteratively, but I can't work out how to hold the values.
In this example, I want the user to be able to add values in the text boxes, which should get added to the bottom of the table in the main panel. At the moment the previously added values are lost.
library(shiny)
runApp(list(
ui=pageWithSidebar(headerPanel("Adding entries to table"),
sidebarPanel(textInput("text1", "Column 1"),
textInput("text2", "Column 2"),
actionButton("update", "Update Table")),
mainPanel(tableOutput("table1"))),
server=function(input, output, session) {
tableStart <- data.frame(Column1 = NA, Column2 = NA)
newEntry <- reactive({
input$update
newLine <- isolate(c(input$text1, input$text2))
})
output$table1 <- renderTable({rbind(tableStart, newEntry())})
}))
I think you want to use reactiveValues()
to store your data frame. Here is a possible solution:
library(shiny)
runApp(list(
ui=pageWithSidebar(headerPanel("Adding entries to table"),
sidebarPanel(textInput("text1", "Column 1"),
textInput("text2", "Column 2"),
actionButton("update", "Update Table")),
mainPanel(tableOutput("table1"))),
server=function(input, output, session) {
values <- reactiveValues()
values$df <- data.frame(Column1 = NA, Column2 = NA)
newEntry <- observe({
if(input$update > 0) {
newLine <- isolate(c(input$text1, input$text2))
isolate(values$df <- rbind(values$df, newLine))
}
})
output$table1 <- renderTable({values$df})
}))
Edit
To avoid creating an empty row, create an empty data.frame rather than one with NA
:
values$df <- data.frame(Column1 = numeric(0), Column2 = numeric(0))
And indexing seems better for adding the rows than rbind()
(which messes up the column names... not sure why):
isolate(values$df[nrow(values$df) + 1,] <- c(input$text1, input$text2))