shinyjs-延迟ID的SetbookMarketExclude

shinyjs-延迟ID的SetbookMarketExclude,shiny,shinyjs,Shiny,Shinyjs,我试图从Shiny中的被动书签上下文中排除ShinyJS延迟。我看到URL中的延迟ID是自动生成的,并且总是不同的:delay-ad190e10123bd97f960fed7a8a9e6fde=3000 我试图通过正则表达式排除延迟,但我不相信正在解析正则表达式: setBookmarkExclude( c("delay-[[:alnum:]]")) 我想要一种方法,可以在延迟上设置ID,使其每次都相同,或者对setBookmarkExclude进行正则化,以排除随机生成的延迟ID,请

我试图从Shiny中的被动书签上下文中排除ShinyJS延迟。我看到URL中的延迟ID是自动生成的,并且总是不同的:delay-ad190e10123bd97f960fed7a8a9e6fde=3000

我试图通过正则表达式排除延迟,但我不相信正在解析正则表达式:

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

我想要一种方法,可以在延迟上设置ID,使其每次都相同,或者对setBookmarkExclude进行正则化,以排除随机生成的延迟ID,请参见以下示例:

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)
库(闪亮)
图书馆(shinyjs)

我看看我的答案,这很好-谢谢。有没有办法让setBookmarkExclude在不同的反应上下文中执行?我问这个问题的原因是因为我在observe中包装了我的setBookMarkexclude,现在长(>2000)字符的URL会一直显示,直到服务器函数完成运行。我不确定您想要实现什么。如果您只想减少URL长度,可以将书签设置为服务器模式。我在下面提供了一个简单的例子。谢谢-这回答了我的问题。最后一个问题,如果可以的话。我的应用程序中有很多输入(~100),我真的只需要我的用户在URL中交互和操作大约3个。有没有一种方法可以自动排除所有输入,只列出一些要在URL中显示的输入?我问这个问题的原因是要花很多时间浏览每一页来确定要包含在setBookmarkExclude()中的潜在输入。当然,这也是可能的。使用这种方法,您甚至不必
grep
延迟ID。我相应地更新了我的答案。对此有一个小小的改进-似乎
ExcludedIDs
可以成为一个常规的
reactive()
,而不是
reactiveVal()
,这在possible@DeanAttali感谢您的评论,相应地更新了答案。
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)