动态创建带有闪亮图表的选项卡,而无需重新创建现有选项卡

时间:2016-01-26 18:08:41

标签: r shiny rstudio reactive-programming

我想创建动态标签,每次用户点击按钮时,都会创建一个新标签。每个选项卡都具有相同的内容,用户可以使用各种小部件来选择要绘制的数据集。

目前,我正在使用解决方案here动态创建我的标签,但是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)
})

`

for循环的方法发布here以在每个标签上创建图。

然而,似乎不是创建新标签,而是上面的两个解决方案都重新创建所有现有标签。因此,如果当前打开了10个选项卡,则会重新创建所有10个选项卡。不幸的是,这也会重置每个选项卡上的所有用户设置(除了减慢应用程序速度),并且必须按照here显示额外的规定,由于输入对象数量很大,这会进一步降低应用程序的速度必须创建。

我看到一个菜单项的解决方案似乎通过简单地将所有菜单项存储在一个列表中来解决这个问题,每次生成一个新的菜单项时,它只是添加到列表中,以便所有其他现有的不需要创建项目。这样的标签和渲染图也可以这样吗?

这是代码:

 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&lt; - list(menu_vals $ menu_list)正在做什么,为什么Rstudio说它必须在一个反应​​式表达式中,为什么用menu_list = null创建一个名为menu_vals的新列表,它会非常感谢:)

编辑:我认为每次创建新标签时我都能够阻止重新创建绘图,并且还可以使用

来避免需要最多的绘图
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 个答案:

答案 0 :(得分:12)

我想提出一个解决方案,添加一个功能到闪亮,这应该很久以前已经实现了闪亮的基础。 将tabPanel附加到现有tabsetPanels 的函数。我已经尝试了类似的东西herehere,但这一次,我觉得这种解决方案更稳定,更通用。

对于此功能,您需要将4部分代码插入到闪亮的应用中。然后,您可以通过调用File file = new File(args[0]); FileReader fr = new FileReader(file); 向现有tabPanels添加任意一组tabsetPanel,每个任何内容。它的参数是addTabToTabset(或tabPanel列表)和目标tabPanels的名称(id)。如果您只想添加普通tabsetPanel,它甚至适用于navbarPage

应该复制粘贴的代码位于&#34;重要!&#34;评论。

我的评论可能不足以掌握实际发生的事情(以及为什么会这样)。因此,如果您想了解更多细节,请留言,我会尽力详细说明。

复制粘贴润播放!

tabPanels

答案 1 :(得分:5)

这可能与@ k-rohde的回答有关,而不是原帖。现在有一组方法可以在tabset中添加/删除/追加选项卡:

library(shiny)
runApp(list(
  ui=fluidPage(
    fluidRow(
      actionLink("newTab", "Append tab"),
      actionLink("removeTab", "Remove current tab")
    ),
    tabsetPanel(id="myTabs", type="pills")
  ),
  server=function(input, output, session){
    tabIndex <- reactiveVal(0)
    observeEvent(input$newTab, {
      tabIndex(tabIndex() + 1)
      appendTab("myTabs", tabPanel(tabIndex(), tags$p(paste("I'm tab", tabIndex()))), select=TRUE)
    })
    observeEvent(input$removeTab, {
      removeTab("myTabs", target=input$myTabs)
    })
  }
))

希望这可以帮助任何人登陆这里寻找“如何在标签集中动态添加/删除标签”。