我为我的闪亮应用程序提供了一个自定义书签URL。我使用setBookmarkExclude()
排除所有输入(即小部件)。然后,我使用onBookmark()
构建书签URL,并使用onRestore()
恢复状态。
在开发过程中,如果添加了新的窗口小部件,则它们的ID也必须添加到setBookmarkExclude()
函数中。如果没有,则书签URL将更改。
是否有排除所有输入的正确方法?
最初,我尝试了setBookmarkExclude(names(input))
,但是由于input
尚未初始化时,该函数是从应用程序的服务器函数内部调用的,因此无法正常工作。
很明显,相反的函数setBookmarkInclude(NULL)
是理想的吗?
答案 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)