我想把我的全部内容sidebarLayout
放在服务器端使用renderUI()
,像这样:
library(shiny)
library(bslib)
ui <- fluidPage(
uiOutput("sidebarpanel")
)
server <- function(input, output, session) {
output$sidebarpanel <- renderUI({
sidebarLayout(
sidebarPanel(width = 3,
selectizeInput("country", "Country:", choices = c("a", "b"))
),
mainPanel(width = 9,
page_fillable(
layout_columns(height = 200,
card(card_header("card1")),
card(card_header("card2"))
)
)
)
)
})
}
shinyApp(ui = ui, server = server)
如果我将我的sidebarpanel
块保持在 UI 端,它看起来很好:
library(shiny)
library(bslib)
ui <- fluidPage(
sidebarLayout(
sidebarPanel(width = 3,
selectizeInput("country", "Country:", choices = c("a", "b"))
),
mainPanel(width = 9,
page_fillable(
layout_columns(height = 200,
card(card_header("card1")),
card(card_header("card2"))
)
)
)
)
)
server <- function(input, output, session) { }
shinyApp(ui = ui, server = server)
是否有renderXXXX
我应该使用的功能来代替renderUI
保留卡片的样式?
在 bslib 应用中,应该使用bslib 的
page_*
函数而不是 Shiny 的*Page
构造函数。因此,fluidPage()
用替换page_fluid()
可以解决你的问题。这两个函数之间的主要区别在于,Shiny 的页面构造函数默认使用 Bootstrap 3,而 bslib 的函数默认使用 bslib 推荐的 Bootstrap 版本(当前为 5,请参阅
bslib::version_default()
)。在 中使用代码的示例中ui
,隐式使用会导致整个页面使用 Bootstrap 5,而在服务器内部代码的示例中,旧的 Bootstrap 版本是从中的page_fillable()
推断出来的。fluidPage()
ui
另请参阅rstudio/shiny#4075中的相关讨论。