我有一个Shiny UI,以每个绘图的两个绘图和相应的输入字段开头。一般结构看起来像这样:
<header>
<main>
<plotarea1>
<inputs1>
<chart1>
</plotarea1>
<plotarea2>
<inputs2>
<chart2>
</plotarea2>
</main>
我可以使用两个按钮动态添加和删除plotareas。这非常有效,只是如果我改变图表的数量就会重新渲染整个主区域。从计算的角度来看,这并不是那么糟糕(它只是渲染,而不是重新执行的数据获取)但是当重新渲染输入时,它们的值被重置为默认值。反过来,这也会迫使图表发生变化。
因此,我的问题是:如何动态添加一个plotarea(输入列表+图表),以便现有的plotareas不受此影响?
我说我必须隔离数字反应并手动触发渲染代码一旦我在添加/删除功能中手动添加了绘图区域。这意味着我保存了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。
此致 罗伯特