Динамическое создание вкладок с блестящими графиками без повторного создания существующих вкладок
Я хотел бы создать динамические вкладки, где каждый раз, когда пользователь нажимает кнопку, создается новая вкладка. Каждая вкладка имеет одинаковое содержимое с различными виджетами, которые пользователь может использовать для выбора наборов данных, которые будут отображаться.
В настоящее время я использую решениеВот динамически создавать мои вкладки, но с изменением, которое 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
})
Тем не менее, я до сих пор не могу понять, как использовать это для создания вкладок. Я попробовал тот же метод, но он не работал.