gpt4 book ai didi

r - 如何添加书签和恢复动态添加的模块?

转载 作者:行者123 更新时间:2023-12-04 02:25:33 27 4
gpt4 key购买 nike

我正在尝试保存和恢复使用动态呈现 UI 输出的模块的应用。

我希望书签功能适用于该应用程序,因此我添加了 bookmarkButton 并使用 enableBookmarking = "server" 启用了书签功能。我还使 ui 成为一个函数。我了解到 bookmarking works with modules ,但我无法找到一种方法让它与动态创建的 UI 输入和输出一起工作。仅恢复最后的输入和输出。其他的没有恢复。

示例应用:

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")

只恢复最后的输入和绘图输出:

enter image description here

最佳答案

人们希望所有模块实例都被恢复,但正如您所指出的,由于 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")

关于r - 如何添加书签和恢复动态添加的模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67973185/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com