如何获取Flexdashboard文档中的当前活动选项卡以反应显示不同的UI

问题描述

我目前正在尝试制作一个Flexdashboard闪亮的应用程序。我希望能够在侧边栏显示不同的UI,因为在我的输出区域中哪个标签处于活动状态。

为此,我考虑使用renderUI和一些基本条件。但是我的问题是我不知道如何在flexdashboard中获得活动选项卡。我已经进行了一些研究,但找不到该信息。我不确定是否可以像闪亮的那样将id添加到选项卡集中,并且如果可能的话,如何获得与id对应的结果。

这是我想做的一些基本代码

---
title: "Test"
runtime: shiny
output:
  flexdashboard::flex_dashboard:
    vertical_layout: scroll
---
```{r setup,include=FALSE}
suppresspackageStartupMessages({
library(shiny)
library(flexdashboard)
})
```


# Page 1

## Input {.sidebar}

```{r}
radioButtons("radio",label = h3("Radio buttons"),choices = list("Choice 1" = 1,"Choice 2" = 2,"Choice 3" = 3),selected = 1)


output$list1 <- renderUI({
  if (tab == "Tabs 1") {
    selectInput("select",label = h3("Select Box"),selected = 1)
  } 
  else {}
})

uIoUtput("list1")
```

Column {.tabset }
-------------------------------------

### Tab 1

### Tab 2

### Tab 3

感谢您的帮助:)

解决方法

似乎与在tabsetPanel(...,id = "xyz")中创建input$xyz变量的情况不同,Rmarkdown并没有表现出同样的礼貌。

因此,我们需要借助一些JavaScript来自行破解该功能:

---
title: "Test"
runtime: shiny
output:
  flexdashboard::flex_dashboard:
    vertical_layout: scroll
---
<script>
$("body").on("shown.bs.tab","a[data-toggle='tab']",function(e) {
   Shiny.setInputValue("active_tab",$(e.target).parent().index());
})
</script>

我们告诉shiny,每当显示标签时,我们都希望将输入变量(即,我们可以在shiny端做出反应的值)设置为相应的标签号(从0开始)

然后我们可以使用input$active_tab来设置服务器逻辑:

output$list1 <- renderUI({
   sel <- input$active_tab
   if (is.null(sel) || sel == 0) {
      selectInput("select",label = h3("Select box"),choices = list("Choice A1","Choice A2","Choice A3"),selected = 1)
   } else if (sel == 1) {
      selectInput("select",choices = list("Choice B1","Choice B2","Choice B3"),selected = 1)
   } else {
            selectInput("select",choices = list("Choice C1","Choice C2","Choice C3"),selected = 1)
   }
})

注意。我猜有一个更好的事件而不是shown.bs.tab可以附加事件处理程序的事件。这可能有助于避免在NULL部分中测试render情况。发生这种情况的原因是,默认情况下,当第一个标签页显示时,shown.bs.tab显然不会触发。