我有这个应用程序,书签shiny 效果很好,除了它只能在页面刷新后恢复最后一个手风琴面板.如果我重新生成相同的面板,则可以看到文本输入已恢复.但它需要用户重新生成电池板.可以用书签恢复手风琴面板吗?

示例应用程序

library(shiny)
library(bslib)

ui <- function(request) {
  fluidPage(
    theme = bs_theme(version = 5),
    titlePanel("Dynamic Tabs with Bookmarking"),
    sidebarLayout(
      sidebarPanel(
        textInput("tab_name", "Tab Name"),
        actionButton("add_tab", "Add Tab")
      ),
      mainPanel(
        accordion(
          id = "tabs"
        )
      )
    )
  )
}

server <- function(input, output, session) {
  # Reactive value to store tab names
  tabs <- reactiveVal(character(0))

  # Function to add a new tab
  observeEvent(input$add_tab, {
    new_tab_name <- isolate(input$tab_name)
    if (!is.null(new_tab_name) && new_tab_name != "") {
      accordion_panel_insert(id = "tabs",
                panel = accordion_panel(title = new_tab_name, value = new_tab_name,
                                        textInput(paste0(new_tab_name, "_my"), label="Enter:"))
      )
      # Update reactive value with new tab name
      tabs(c(tabs(), new_tab_name))
    }
  })


  # Update bookmark state
  observe({

    session$doBookmark()
  })

  # Update URL
  onBookmarked(updateQueryString)
}

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

推荐答案

使用onBookmarkonRestore:

library(shiny)
library(bslib)

ui <- function(request) {
  fluidPage(
    theme = bs_theme(version = 5),
    titlePanel("Dynamic Tabs with Bookmarking"),
    sidebarLayout(
      sidebarPanel(
        textInput("tab_name", "Tab Name"),
        actionButton("add_tab", "Add Tab")
      ),
      mainPanel(
        accordion(
          id = "tabs"
        )
      )
    )
  )
}

server <- function(input, output, session) {
  # Reactive value to store tab names
  tabs <- reactiveVal(character(0))
  
  # Function to add a new tab
  observeEvent(input$add_tab, {
    new_tab_name <- isolate(input$tab_name)
    if (!is.null(new_tab_name) && new_tab_name != "") {
      accordion_panel_insert(id = "tabs",
                             panel = accordion_panel(title = new_tab_name, value = new_tab_name,
                                                     textInput(paste0(new_tab_name, "_my"), label="Enter:"))
      )
      # Update reactive value with new tab name
      tabs(c(tabs(), new_tab_name))
    }
  })
  
  
  # Update bookmark state
  observe({
    session$doBookmark()
  })
  
  onBookmark(function(state) {
    state$values$Tabs <- tabs()
  })
  
  onRestore(function(state) {
    for(tab_name in head(state$values$Tabs, -1)) {
      accordion_panel_insert(
        id = "tabs",
        panel = accordion_panel(
          title = tab_name, value = tab_name,
          textInput(paste0(tab_name, "_my"), label="Enter:")
        )
      )
    }
  })
  
  # Update URL
  onBookmarked(updateQueryString)
}

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

R相关问答推荐

从具有随机模式的字符串中提取值

查找满足SpatRaster中条件的单元格位置

基于shiny 应用程序中的日期范围子集xts索引

用derrr在R中查找组间的重复项

多个模拟序列间的一种预测回归关系

您是否可以将组添加到堆叠的柱状图

用满足特定列匹配的另一行替换NA行

在生成打印的自定义函数中,可以通过变量将线型或 colored颜色 设置为NULL吗?

有毒元素与表观遗传年龄的回归模型

如何从嵌套数据中自动创建命名对象?在R中

名字的模糊匹配

按组使用dummy r获取高于标准的行的平均值

R:使用ApexCharge更改标签在饼图中的位置

我已经运行了几个月的代码的`Palette()`中出现了新的gglot错误

如何在R中使用因子行求和?

如何在矩阵图中按标准对数据进行分组以绘制矩阵

如何为包创建自定义roxygen2标签?

在R中,有没有什么方法可以根据一列中的多个值来过滤行?

如何在一个GGPLATE中绘制多个灰度平滑?

使用卡环从R中的列中删除单位(&C)