R Shiny DT navigate to the table's last page via an action button

I have a Shiny app that allows the user to enter their project details to the database. This is achieved by the Add Project Details Button that adds an empty row to the table. Now the next step is:

  • When the add button is clicked, the app automatically goes to the last record/page (that now has the new empty row) instead of having the user to click on the last page number.

How can I do this?

Sample Data (df):

structure(list(year = 1980:2021, AvgTMean = c(24.2700686838937, 
23.8852956598276, 25.094446596092, 24.1561175050287, 24.157183605977, 
24.3047482638362, 24.7899738481466, 24.5756232655603, 24.5833086228592, 
24.7344695534483, 25.3094451071121, 25.2100615173707, 24.3651692293534, 
24.5423890611494, 25.2492166633908, 24.7005097837931, 24.2491591827443, 
25.0912281781322, 25.0779264303305, 24.403294248319, 24.4983991453592, 
24.4292324356466, 24.8179824927011, 24.7243948463075, 24.5086534543966, 
24.2818632071983, 24.4567195220259, 24.8402224356034, 24.6574465515086, 
24.5440715673563, 23.482670620977, 24.9979594684914, 24.5452453980747, 
24.9271462811494, 24.7443215819253, 25.8929839790805, 25.1801908261063, 
25.2079308058908, 25.0722425561207, 25.4554644289799, 25.4548979078736, 
25.0756772250287)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-42L)) 

Code:

library(shiny)
library(shinythemes)
library(DT)
library(tidyverse)

# Define UI for application that draws a histogram
ui =    navbarPage(
                  tags$style("table, .table {color: unset;} .dataTable th, .datatables input {color: white}"),
                  title = div("GIS Team Projects"),
                  theme = shinytheme("cyborg"),
                  tabPanel("GIS Projects",
                           icon = icon("info"),
                           div(p(h1("Instructions:"),style="text-align: justify;")),
                           p("1. The user can add their project details.", style="color:black"),
                           uiOutput("all"),
                  sidebarLayout(
                    sidebarPanel(
                      actionButton("addData", "Add Project Details"),
                      ),
                    mainPanel(
                      downloadButton("download1","Download data as csv"),                
                      DTOutput("contents"),
                      ## include JS code via tags$script(HTML(...)):
                      tags$script(HTML("
           Shiny.addCustomMessageHandler('messageJumpToLast', function(message) {
               // select the target table via its container ID and class:
               var target = $('#contents .dataTable');
               // display last page:
               target.dataTable().api().page('last').draw(false);
           });
           "))),
                    )
                    )
)

# Define server logic required to draw a histogram
server <- function(input, output, session) {

  myData = df
  
  # Create an 'empty' tibble 
   user_table =
     myData %>% 
      slice(1) %>% 
    # Transpose the first row of test into two columns
    gather(key = "column_name", value = "value") %>%
    # Replace all values with ""
    mutate(value = "") %>%
    # Reshape the data from long to wide
    spread(column_name, value) %>%
    # Rearrange the column order to match that of test
    select(colnames(myData))
   
   # Display data as is
   output$contents =
     renderDT(myData,
              server = FALSE,
              editable = TRUE,
              options = list(lengthChange = TRUE),
              rownames = FALSE)
   
   # Store a proxy of contents 
   proxy = dataTableProxy(outputId = "contents")
   
   # Each time addData is pressed, add user_table to proxy
   observeEvent(eventExpr = input$addData, {
     proxy %>% 
       addRow(user_table)
     session$sendCustomMessage('messageJumpToLast', 'some payload here, if needed')
   })
  
}

# Run the application 
shinyApp(ui = ui, server = server)

Adding dataTableProxy(..., deferUntilFlush = FALSE) fixes thee problem.

This topic was automatically closed 7 days after the last reply. New replies are no longer allowed.

If you have a query related to it or one of the replies, start a new topic and refer back with a link.