如何为动态添加的模块添加书签并进行恢复? [英] How to bookmark and restore dynamically added modules?

查看:9
本文介绍了如何为动态添加的模块添加书签并进行恢复?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试保存并还原使用可动态呈现UI输出的模块的应用。

我希望书签功能可以与应用程序配合使用,我添加了bookmarkButton并使用enableBookmarking = "server"启用了书签。我还使UI成为一个函数。我了解了bookmarking works with modules,但是我找不到一种方法来让它与动态创建的UI输入和输出一起工作。仅恢复最后的输入和输出。其他未还原。

示例APP:

library(shiny)

histogramUI <- function(id) {
  tagList(
    fluidRow(column( 4, selectInput(NS(id, "var"), "Variable", choices = names(mtcars)),
    numericInput(NS(id, "bins"), "bins", value = 10, min = 1)),
    column(8, plotOutput(NS(id, "hist"))))
  )
}


histogramServer <- function(id) {
  moduleServer(id, function(input, output, session) {
    data <- reactive(mtcars[[input$var]])
    output$hist <- renderPlot({
      hist(data(), breaks = input$bins, main = input$var)
    }, res = 96)
  })
}

ui <- function(request){
  fluidPage(
    bookmarkButton(),
    actionButton("add", "Add"),
    div(id = "add_here")
    )
  }

server <- function(input, output, session) {
  
  
  observeEvent(input$add, {
    histogramServer(paste0("hist_", input$add))
    insertUI(selector = "#add_here", ui = histogramUI(paste0("hist_", input$add)))
  })
  
  
}

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

仅恢复最后一次输入和绘图输出:

推荐答案

预计会还原所有模块实例,但正如您所指出的,由于add按钮还原,只还原了最后一个模块实例。
作为解决办法,您可以使用onBookmark存储state$exclude中存储的模块实例列表,然后使用onRestore重新创建模块实例。
histogramUI已修改,以便接受var,bins作为创建模块的新参数。
另一个要点是使用setBookmarkExclude,这样add按钮就不会在恢复时创建最后一个模块。由于该按钮不再是书签,因此它的值也应该与onBookmark一起保存。

尝试:

library(shiny)


histogramUI <- function(id,var,bins) {
  tagList(
    fluidRow(column( 4, selectInput(NS(id, "var"), "Variable", choices = names(mtcars),selected=var),
                     numericInput(NS(id, "bins"), "bins", value = bins, min = 1)),
             column(8, plotOutput(NS(id, "hist"))))
  )
}


histogramServer <- function(id) {
  moduleServer(id, function(input, output, session) {
    data <- reactive(mtcars[[input$var]])
    output$hist <- renderPlot({
      hist(data(), breaks = input$bins, main = input$var)
    }, res = 96)
  })
  
}


ui <- function(request){
  fluidPage(
    bookmarkButton(),
    actionButton("add", "Add Histogram"),
    div(id = "add_here")
  )
}

server <- function(input, output, session) {
  
  add_id <- reactiveVal(0)  # To save 'add' button state
  setBookmarkExclude('add') # Don't add new module at restoration
  
  observeEvent(input$add, {
    histogramServer(paste0("hist_", input$add+add_id()))
    insertUI(selector = "#add_here", ui = histogramUI(paste0("hist_", input$add+add_id()),'mpg',10))
  })
  
  
  onBookmark(function(state) { 
    modules <- state$exclude
    state$values$modules <- modules[grepl("hist",modules)] # only 'hist' (without 'add')
    state$values$add <- state$input$add + add_id() # add button state
  })
  
  onRestore(function(state){
    # Restore 'add' last state
    add_id(state$values$add)

    # Restore 'hist' modules
    modules <- state$values$modules
    if (length(modules)>0) {
      for (i in 1:(length(modules))) {
          histogramServer(modules[i])
          insertUI(selector = "#add_here", ui = histogramUI(modules[i],paste0(modules[i],"-var"),paste0(modules[i],"-bin")))
      }
    }
  })
  
}

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

这篇关于如何为动态添加的模块添加书签并进行恢复?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆