Search code examples
rshinyrsconnect

Displaying deployment time on R shiny app


I have a shiny app which will be redeployed roughly each week to shinyapps.io using the rsconnect package.

On the front page of the app I want to display the time the app was last deployed.

I thought this would be possible by doing something along the lines of this:

library(shiny)

deployment_time <- lubridate::now()

ui <- fluidPage(

  p(glue::glue("Deployment time {deployment_time}"))
)
server <- function(input, output) {

}

shinyApp(ui = ui, server = server)

The reasoning behind this is that deployment_time is set outwith the server, so should only be run once when the app is deployed and not when users view the app later on.

However, the behaviour I am observing is that after a few times loading the app the deployment time will update to the current time, suggesting that this code is in fact rerun at some point.

Any ideas what's going on and how I can set a deployment time which stays fixed without having to manually set a date in the script?

Thanks in advance :)


Solution

  • I would store the last deployment date in a local file that's uploaded to the your Shiny Server alongside your application code.

    Below is a minimally reproducible example.

    Deployment Record

    First is a function that you will only run when deploying an application. You can take some time to insert this function into your deployment scripts so that it writes the time prior to uploading your files to the server.

    #' Record the date of app deployment.
    record_deployment_date <-
      function(deployment_history_file = "deployment_history.txt") {
        # make sure the file exists...
        if (!file.exists(deployment_history_file)) {
          file.create(deployment_history_file)
        }
        
        # record the time
        deployment_time <- Sys.time()
        cat(paste0(deployment_time, "\n"),
            file = deployment_history_file,
            append = TRUE)
      }
    

    Then, you'll have another function to access the last recorded deployment date.

    #' Return the last recorded deployment date of the application.
    load_deployment_date <-
      function(deployment_history_file = "deployment_history.txt") {
        deployment_history <- readLines(deployment_history_file)
        
        # return the most recent line
        deployment_history[[length(deployment_history)]]
      }
    

    Minimal App Example

    Finally, you can call the previous function and insert the loaded text into a renderText function to show your last deployment date.

    ui <- fluidPage(mainPanel(tags$h1("My App"),
                              textOutput("deploymentDate")))
    
    server <- function(input, output, session) {
      output$deploymentDate <- renderText({
        paste0("Deployment Time: ", load_deployment_date())
      })
    }
    
    shinyApp(ui, server)
    

    Naturally you will want to change the location of your deployment_history.txt file, customize the formatting of your time, etc. You could take this one step further to also include the deployment version. But, this is the minimal info you need to get started.