我想以一种直观的方式在R Shiny中实现可折叠列,并在ui.R
中留下尽可能多的非交互式UI代码。
我已经找到了几种制作可折叠列的方法。一种是将整个UI放入renderUI
中server.R
的调用中,并根据输入条件呈现不同的布局,如下所示:
shinyApp(
ui = fluidPage(
uiOutput("panels"),
checkboxInput("showSidePanel", "Show Side Panel", TRUE)
),
server = function(input, output) {
output$panels <- renderUI(
if (input$showSidePanel) {
fluidRow(
column(4,
wellPanel(h2("Side Panel"))
),
column(8,
wellPanel(h2("Main Panel"))
)
)
}
else
wellPanel(h2("Main Panel")))
}
)
但是,这不可扩展(想象添加几个可选面板),并且代码的结构不反映其功能。此外,将整个用户界面置于单个renderUI
来电中是不直观且难看的,而ui.R
几乎是空的。
另一个选择是使用远离bootstrap并使用fillRow()
:
shinyApp(
ui = fluidPage(
fillRow(flex = c(NA, 1), height = 100,
uiOutput("sidePanel"),
wellPanel(h2("Main Panel"))
),
checkboxInput("showSidePanel", "Show Side Panel", TRUE)
),
server = function(input, output) {
output$sidePanel <- renderUI(
if (input$showSidePanel) {
wellPanel(h2("Side Panel"))
} else {
NULL
}
)
}
)
这是可扩展的,虽然UI仍然完全驻留在服务器代码中,但至少它在逻辑上是分开的。然而,将一堆非交互式UI放入我的服务器代码只是为了使其可折叠仍然是违反直觉的[我的实际侧面板由许多UI元素组成]。有没有一种简单或合乎逻辑的方法可以解决这个问题?如果可能的话,我希望坚持使用fluidPage
/ fluidRow
/ column
方法。