gpt4 book ai didi

r - 在 Shiny 中创建有条件可见的侧边栏

转载 作者:行者123 更新时间:2023-12-04 12:34:37 25 4
gpt4 key购买 nike

在 R 和 shiny , 我想在 shinydashboard 中使用制表符.仪表板通常有一个侧边栏,但对于一个选项卡,我希望侧边栏消失,以便为页面主体提供更多屏幕空间。

我知道有条件面板,但是否可以在激活选项卡时调整侧边栏的可见性?

下面是一些模拟代码,用于设置带有三个选项卡和一个侧边栏的 Shiny 仪表板。

library(shiny)
library(shinydashboard)

ui <- dashboardPage(
dashboardHeader(),
# I would like to make the sidebar not visible if the third tab is selected...
# something like...
#if(input.tabs==3){dashboardSidebar(disable = TRUE)}else{dashboardSidebar()},
dashboardSidebar(),
if(input.tabs==3){dashboardSidebar(disable = TRUE)}else{dashboardSidebar()},
dashboardBody(
fluidRow(
column(width=12,
tabsetPanel(id='tabs'
tabPanel('tab1',
plotOutput('plot1'),value=1),
tabPanel('tab2',
plotOutput('plot2'),value=2),
tabPanel('tab3',
plotOutput('plot3'),value=3)
)
))
)
)

server <- function(input, output) {
output$plot1 <- renderPlot({
out <- ggplot(data.frame(X1=rnorm(1000)),aes(X1))+
geom_density(fill='light blue')+
theme_minimal()
print(out)
})
output$plot2 <- renderPlot({
out <- ggplot(data.frame(X1=rnorm(1000)),aes(X1))+
geom_density(fill='light blue')+
theme_minimal()
print(out)
})
output$plot3 <- renderPlot({
out <- ggplot(data.frame(X1=rnorm(1000)),aes(X1))+
geom_density(fill='light blue')+
theme_minimal()
print(out)
})
}

shinyApp(ui, server)

最佳答案

直到 5 分钟前我看到这个问题时,我才使用仪表板,所以这可能不是最好的答案,但它确实有效。

看起来当您手动“隐藏”侧边栏时,body标签获得一个“侧边栏折叠”类。所以我的解决方案是添加 javascript,在选择第三个选项卡时将该类添加到 body 标记中。 The one downside is that when another tab is chosen, the sidebar will not re-expand, it will stay hidden until you manually expand it again.

免责声明:在我的回答中,我使用了我写的一个包,shinyjs。

这是 Shiny 的应用程序:

library(shiny)
library(shinydashboard)
library(ggplot2)
library(shinyjs)

ui <- dashboardPage(
dashboardHeader(),
dashboardSidebar(),
dashboardBody(
useShinyjs(),
extendShinyjs("app.js"),
fluidRow(
column(width=12,
tabsetPanel(id='tabs',
tabPanel('tab1',
plotOutput('plot1'),value=1),
tabPanel('tab2',
plotOutput('plot2'),value=2),
tabPanel('tab3',
plotOutput('plot3'),value=3)
)
))
)
)

server <- function(input, output, session) {
output$plot1 <- renderPlot({
out <- ggplot(data.frame(X1=rnorm(1000)),aes(X1))+
geom_density(fill='light blue')+
theme_minimal()
print(out)
})
output$plot2 <- renderPlot({
out <- ggplot(data.frame(X1=rnorm(1000)),aes(X1))+
geom_density(fill='light blue')+
theme_minimal()
print(out)
})
output$plot3 <- renderPlot({
out <- ggplot(data.frame(X1=rnorm(1000)),aes(X1))+
geom_density(fill='light blue')+
theme_minimal()
print(out)
})

observe({
if (input$tabs == 3) {
js$hideSidebar()
}
})
}

shinyApp(ui, server)

我只在你的应用程序中添加了几行:我添加了对 useShinyjs() 的调用和 extendShinyjs("app.js")在 UI 中,我添加了 observe({ if (input$tabs == 3) js$hideSidebar() })到服务器。我还添加了 session服务器函数的参数。您还需要添加一个名为“app.js”的 javascript 文件,其中包含以下行:
shinyjs.hideSidebar = function(params) { $("body").addClass("sidebar-collapse") }

您也可以避免使用 shinyjs并使用 Shiny 的正常消息传递来调用类似的 javascript 函数。

编辑:使用最新的 shinyjs 版本 0.0.6.1,如果您希望内联提供 javascript 代码,则无需使用单独的文件。只需将调用替换为 extendShinyjs("app.js")
extendShinyjs(text = 'shinyjs.hideSidebar = function(params) { $("body").addClass("sidebar-collapse") }')

关于r - 在 Shiny 中创建有条件可见的侧边栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30418582/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com