我有一个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 .
关心罗伯特