我有一个Shiny UI,以两个图和每个图的相应输入字段开头 . 一般结构看起来像这样:

<header>
<main>
  <plotarea1>
    <inputs1>
    <chart1>
  </plotarea1>
  <plotarea2>
    <inputs2>
    <chart2>
  </plotarea2>
</main>

我可以使用两个按钮动态添加和删除plotareas . 这非常有效,只是如果我改变图表的数量就会重新渲染整个主区域 . 从计算的角度来看,这并不是那么糟糕(它只是渲染,而不是重新执行的数据获取)但是当重新渲染输入时,它们的值将重置为默认值 . 反过来,这也迫使图表也发生变化 .

因此,我的问题是:如何动态添加plotarea(输入图表列表),以便现有的plotareas不受此影响?

我想说,一旦我在添加/删除功能中手动添加了一个plotarea,我必须隔离numcharts被动并手动触发渲染代码 . 这意味着我保存了plotareas列表,然后只是向/从列表中追加/删除元素 . 然而,这导致了一些奇怪的错误(遗憾的是我不记得了)

server.R看起来像这样:

observe({
   lapply(1:numcharts(),function(i){
      output[[paste0("plot",i)]] <- renderPlot({
        dataset <- react[[paste0("dataset",i)]]()
        plotValues(dataset)
      })
   })    
})

observe({
    output$charts <- renderUI({
      lapply(1:numcharts(), function(i) {
        list(
          fluidRow(
            column(2,
                   selectInput(paste0("selectedInput",i),
                               label=paste("Select input",i),
                               choices=choices,
                               selected=choices[1]
                   )
            ),

            <more inputs>
          ),
          fluidRow(
            column(9,
               plotOutput(paste0("plot",i))
            )
          ) 
        )
      })
    })
})

numcharts是一个被动的,它返回当前要绘制的绘图区域的数量,而数据集是一个被动的,它根据输入返回一个特定的数据集 . plotValues根据数据集创建绘图 .

ui.R文件只是渲染输出$ charts .

关心罗伯特