Динамическое создание вкладок с блестящими графиками без повторного создания существующих вкладок

Я хотел бы создать динамические вкладки, где каждый раз, когда пользователь нажимает кнопку, создается новая вкладка. Каждая вкладка имеет одинаковое содержимое с различными виджетами, которые пользователь может использовать для выбора наборов данных, которые будут отображаться.

В настоящее время я использую решениеВот динамически создавать мои вкладки, но с изменением, которое lapply вызывает функцию, которая вызывает tabPanel и добавляет контент на вкладки

`

renderUI({
some_data <- # Dataframe that data is extracted goes here
createTabs <- function(tabNum, some_data)
    {
      tabPanel(title = paste("Map", tabNum, sep=" "), 
               fluidRow(
                 column(
                   width = 3,
                   wellPanel(
                     #widgets are added here
    }
 mTabs <- lapply(0:input$map, createTabs, some_data)
 do.call(tabsetPanel, mTabs)
})

`

И методы для петель размещеныВот создать графики на каждой вкладке.

Однако вместо создания новой вкладки кажется, что оба вышеуказанных решения воссоздают все существующие вкладки. Таким образом, если в настоящее время открыто 10 вкладок, все 10 вкладок восстанавливаются. К сожалению, это также сбрасывает все пользовательские настройки на каждой вкладке (в дополнение к замедлению работы приложения), и необходимо принять дополнительные меры, как показаноВот , что еще больше замедляет приложение из-за большого количества объектов ввода, которые должны быть созданы.

Я видел решение для пунктов меню, которое, кажется, решает эту проблему, просто сохраняя все пункты меню в списке, и каждый раз, когда создается новый элемент меню, он просто добавляется в список, чтобы все остальные существующие пункты не Т нужно создать. Возможно ли что-то подобное для вкладок и графиков рендеринга?

Это код:

 newTabs <- renderMenu({
    menu_list <- list(
      menu_vals$menu_list)
    sidebarMenu(.list = menu_list)
  })

  menu_vals = reactiveValues(menu_list = NULL)
  observeEvent(eventExpr = input$placeholder,
               handlerExpr = {
                 menu_vals$menu_list[[input$placeholder]] <- menuSubItem(paste("Saved Simulation", length(menu_vals$menu_list) + 1, sep = " "),
                                                                                    tabName = paste("saved_sim", length(menu_vals$menu_list) + 1)) 
               })

Если кто-то может объяснить мне, что делает menu_list <- list (menu_vals $ menu_list), почему Rstudio говорит, что оно должно быть внутри реактивного выражения, и почему создается новый список с именем menu_vals с menu_list = null, это было бы очень полезно Что ж :)

Изменить: я думаю, что я смог предотвратить повторное создание графиков при каждом создании новой вкладки, а также обойти необходимость максимального количества графиков, используя

observeEvent(eventExpr = input$map,
                 handlerExpr = {
                   output[[paste0("outputComparePlot",simNum,"-",input$map)]] <- outputComparePlot(sessionEnv, config, react, input, simNum, input$map) #This function contains the call to renderPlot

                 })

Тем не менее, я до сих пор не могу понять, как использовать это для создания вкладок. Я попробовал тот же метод, но он не работал.

Ответы на вопрос(2)

Ваш ответ на вопрос