排除闪亮书签中的所有输入

时间:2019-06-21 09:28:43

标签: r shiny

我为我的闪亮应用程序提供了一个自定义书签URL。我使用setBookmarkExclude()排除所有输入(即小部件)。然后,我使用onBookmark()构建书签URL,并使用onRestore()恢复状态。

在开发过程中,如果添加了新的窗口小部件,则它们的ID也必须添加到setBookmarkExclude()函数中。如果没有,则书签URL将更改。

是否有排除所有输入的正确方法?

最初,我尝试了setBookmarkExclude(names(input)),但是由于input尚未初始化时,该函数是从应用程序的服务器函数内部调用的,因此无法正常工作。

很明显,相反的函数setBookmarkInclude(NULL)是理想的吗?

1 个答案:

答案 0 :(得分:1)

您已经提到使用setBookmarkExclude(names(input)),这是正确的选择。

关键是动态使用包裹在观察者中的setBookmarkExclude

这是我的答案here的修改版本,显示了如何排除动态生成的输入:

library(shiny)

ui <- function(request) {
  fluidPage(
    br(),
    bookmarkButton(id = "bookmarkBtn"),
    actionButton(inputId = "addSlider", label = "Add slider..."),
    hr(),
    textOutput("ExcludedIDsOut"),
    hr(),
    sliderInput(inputId="slider1", label="My value will be bookmarked", min=0, max=10, value=5),
    uiOutput("slider2")
  )
}

server <- function(input, output, session) {

  bookmarkingWhitelist <- c("slider1")

  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 = ", "))
  })

  observeEvent(input$addSlider, {
    output$slider2 <- renderUI({ 
      sliderInput(inputId="slider2", label="My value will not be bookmarked", min=0, max=10, value=5)
    })
  }, once = TRUE)

}

enableBookmarking(store = "url")
shinyApp(ui, server)