Search code examples
shinyshinyjs

shinyjs - setBookmarkExclude for delay IDs


I am attempting to exclude a ShinyJS delay from a reactive bookmarking context in Shiny. I see that the delay ID in the URL is autogenerated and always different: delay-ad190e10123bd97f960fed7a8a9e6fde=3000.

I attempted to exclude the delay via regular expression, however I don't believe the regex is being parsed:

setBookmarkExclude(
    c("delay-[[:alnum:]]"))

I would like a way to either set the ID on the delay so it is the same every time or to regex the setBookmarkExclude to exclude the randomly generated delay ID


Solution

  • Please see the following example:

    library(shiny)
    library(shinyjs)
    
    ui <- function(request) {
        fluidPage(
            useShinyjs(),
            br(),
            bookmarkButton(id="bookmarkBtn"),
            hr(),
            textOutput("ExcludedIDsOut"),
            hr(),
            sliderInput(inputId="slider", label="My value will be bookmarked", min=0, max=10, value=5),
            textOutput("out_1"),
            textOutput("out_2"),
            textOutput("out_3")
        )
    }
    
    server <- function(input, output, session) {
        
        observeEvent(input$bookmarkBtn, {
            session$doBookmark()
        })
        
        ExcludedIDs <- reactiveVal(value = NULL)
        
        observe({
            toExclude <- "bookmarkBtn"
            
            delayExclude <- grep("delay", names(input), value = TRUE)
            if(length(delayExclude) > 0){
                toExclude <- c(toExclude, delayExclude)
            }
            
            setBookmarkExclude(toExclude)
            ExcludedIDs(toExclude)
        })
        
        output$ExcludedIDsOut <- renderText({ 
            paste("ExcludedIDs:", paste(ExcludedIDs(), collapse = ", "))
        })
        
        delay(1000, {
            output$out_1 <- renderText({ 
                "My"
            })
        })
        
        delay(2000, {
            output$out_2 <- renderText({ 
                "delayed"
            })
        })
        
        delay(3000, {
            output$out_3 <- renderText({ 
                "output"
            })
        })
    }
    
    enableBookmarking(store = "url") # store = "server"
    shinyApp(ui, server)
    

    Update: Whitelist approach

    library(shiny)
    library(shinyjs)
    
    ui <- function(request) {
      fluidPage(
        useShinyjs(),
        br(),
        bookmarkButton(id="bookmarkBtn"),
        hr(),
        textOutput("ExcludedIDsOut"),
        hr(),
        sliderInput(inputId="slider", label="My value will be bookmarked", min=0, max=10, value=5),
        textOutput("out_1"),
        textOutput("out_2"),
        textOutput("out_3")
      )
    }
    
    server <- function(input, output, session) {
      
      bookmarkingWhitelist <- c("slider")
      
      observeEvent(input$bookmarkBtn, {
        session$doBookmark()
      })
      
      ExcludedIDs <- reactive({
        toExclude <- setdiff(names(input), bookmarkingWhitelist)
        setBookmarkExclude(toExclude)
        toExclude
      })
      
      output$ExcludedIDsOut <- renderText({ 
        paste("ExcludedIDs:", paste(ExcludedIDs(), collapse = ", "))
      })
      
      delay(1000, {
        output$out_1 <- renderText({ 
          "My"
        })
      })
      
      delay(2000, {
        output$out_2 <- renderText({ 
          "delayed"
        })
      })
      
      delay(3000, {
        output$out_3 <- renderText({ 
          "output"
        })
      })
    }
    
    enableBookmarking(store = "url") # store = "server"
    shinyApp(ui, server)
    

    Here is a related GitHub issue, note session$getBookmarkExclude() as an alternative to keep track of the excluded inputs.