r - 根据选定的标签面板显示侧边栏内容
问题描述
我有一个闪亮的仪表板,侧边栏中有两个滑块,正文中有两个选项卡面板。我想要实现的是当我选择“slider1”选项卡面板时只显示“slider1”,当我选择“slider2”选项卡面板时只显示“slider2”。
## app.R ##
library(shiny)
library(shinydashboard)
ui <- dashboardPage(
dashboardHeader(),
dashboardSidebar(
uiOutput("slider1"),
uiOutput("slider2")
),
dashboardBody(
tabsetPanel(
id = 'testingDPEtab',
tabPanel("slider1"
),
tabPanel("slider2"
)
)
)
)
server <- function(input, output) {
output$slider1<-renderUI({
sliderInput("slider1", label = h3("Slider1"), min = 0,
max = 100, value = 50)
})
output$slider2<-renderUI({
sliderInput("slider2", label = h3("Slider2"), min = 0,
max = 200, value = 50)
})
}
shinyApp(ui, server)
解决方案
编辑:
这是使用 shinyJS 的工作解决方案:
library(shinydashboard)
library(shinyjs)
ui <- dashboardPage(
dashboardHeader(),
dashboardSidebar(
useShinyjs(),
uiOutput("slider1"),
uiOutput("slider2")
),
dashboardBody(
tabsetPanel(
id = 'testingDPEtab',
tabPanel("slider1Tab"),
tabPanel("slider2Tab")
)
)
)
server <- function(input, output) {
shinyjs::hide(id="slider1")
shinyjs::hide(id="slider2")
output$slider1<-renderUI({
sliderInput("slider1", label = h3("Slider1"), min = 0,
max = 100, value = 50)
})
output$slider2<-renderUI({
sliderInput("slider2", label = h3("Slider2"), min = 0,
max = 200, value = 50)
})
observe({
if(input$testingDPEtab == "slider1Tab"){
shinyjs::show(id="slider1")
shinyjs::hide(id="slider2")
} else {
shinyjs::hide(id="slider1")
shinyjs::show(id="slider2")
}
})
}
shinyApp(ui, server)
如果您想保留滑块(即隐藏它)而不是重新渲染它,这可能会更好。
原帖
我打算建议使用shinyJs但我无法让它工作 - 可能是因为滑块是在服务器端而不是在 UI 中设置的?
因此,我采用了另一种方法,并将您的 2 个 renderUI 函数调用包装在一个 observe() 事件中。我使用 if/else 语句根据选定的选项卡将一个控件设置为打开,将第二个控件设置为关闭。似乎工作正常。
library(shinydashboard)
ui <- dashboardPage(
dashboardHeader(),
dashboardSidebar(
uiOutput("slider1"),
uiOutput("slider2")
),
dashboardBody(
tabsetPanel(
id = 'testingDPEtab',
tabPanel("slider1Tab"),
tabPanel("slider2Tab")
)
)
)
server <- function(input, output) {
observe({
if(input$testingDPEtab == "slider1Tab"){
output$slider1<-renderUI({
sliderInput("slider1", label = h3("Slider1"), min = 0,
max = 100, value = 50)
})
output$slider2<-NULL
} else {
output$slider1<-NULL
output$slider2<-renderUI({
sliderInput("slider2", label = h3("Slider2"), min = 0,
max = 200, value = 50)
})
}
})
}
shinyApp(ui, server)
推荐阅读
- javascript - body onload 函数在我的示例(JavaScript)中不起作用
- search - Solr 搜索没有给出单个词项的确切结果
- javascript - 如何从浏览器控制台上可见的对象获取数据,但在我的代码上手动遍历它时返回 null?
- c++ - 十六进制到十进制转换器不起作用(c ++)
- angular - 从 ngxs 商店读取
- python - 使用其他模型的属性作为默认值
- laravel - Laravel livewire 和 vuejs 无限滚动
- flutter - Flutter 中受密码保护的 AlertDialog
- python - 使用超时设置从子进程捕获输出
- docker - docker compose 启动的一些容器如何管理