блестящий - setBookmarkExclude для идентификаторов задержки - PullRequest
0 голосов
/ 23 апреля 2019

Я пытаюсь исключить задержку ShinyJS из контекста реактивных закладок в Shiny.Я вижу, что идентификатор задержки в URL генерируется автоматически и всегда отличается: delay-ad190e10123bd97f960fed7a8a9e6fde = 3000.

Я попытался исключить задержку с помощью регулярного выражения, однако я не верю, что регулярное выражение анализируется:

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

Я бы хотел, чтобы либо установить идентификатор задержки, чтобы она была одинаковой каждый раз, либо переопределить setBookmarkExclude, чтобы исключить случайно сгенерированный идентификатор задержки

1 Ответ

0 голосов
/ 24 апреля 2019

Пожалуйста, смотрите следующий пример:

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)

Обновление: Подход из белого списка

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 <- reactiveVal(value = NULL)

  observe({
    toExclude <- setdiff(names(input), bookmarkingWhitelist)
    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)
...