【问题标题】:How to select a specific tab in R Markdown?如何在 R Markdown 中选择特定选项卡?
【发布时间】:2021-05-20 19:15:18
【问题描述】:

我需要从 R Markdown 文档中的 tabset 中选择一个标签(使用 Shiny 运行时)。

我遵循How to select a specific tabPanel in Shiny 中的示例,并尝试使其适应 R Markdown。我将ids 添加到tabset / tab,并在updateTabsetPanel() 调用中使用它们,但它似乎不起作用。 (我使用了在结果仪表板中检查单个 HTML 元素时弹出的名称。)

如何通过单击按钮从tabset 中选择“Chart3”选项卡?

编辑:我需要能够以编程方式选择特定选项卡(例如通过observeEvent() 调用),而不仅仅是在启动时。

---
title: "Tabset Column"
output: flexdashboard::flex_dashboard
runtime: shiny
---
    
Column 
-------------------------------------
    
### Chart 1
    
```{r}
actionButton("switch_tab", "Switch tab", width=200)
```
   
Column {#mytabset .tabset}
-------------------------------------
   
### Chart 2

```{r}
```   
 
### Chart 3 {#mytab}
    
```{r}
observeEvent(input$switch_tab, {
    updateTabsetPanel(session, inputId = "section-mytabset", selected = "#section-mytab")
})
```

【问题讨论】:

  • @Waldi 很有趣。理想情况下,我更喜欢不涉及(复杂)JavaScript 代码的解决方案。最好的原生 R/Shiny 解决方案(例如 updateTabsetPanel() 或类似)。

标签: r shiny r-markdown


【解决方案1】:

{.active} 属性可以在启动仪表板时回答您的问题(静态解决方案),并与 html_document 一起使用:

---
title: "Active Tabset"
output: html_document
---
    

Column {.tabset}
-------------------------------------
   
### Tab 1

Some text
 
### Tab 2 {.active}

Some other text

不幸的是,这不适用于Flexdashboard

---
title: "Active Tabset"
output: flexdashboard::flex_dashboard
---
    

Column {.tabset}
-------------------------------------
   
### Tab 1

Some text
 
### Tab 2 {.active}

Some other text

该问题已被通知here,但由于自动锁定而被关闭。
为了遵守RMarkdownissue guide的等待期结束,我用上面的Minimal Reproducible Example提交了new issue

编辑: 这个请求是taken into account,所以这应该很快就会与 Shiny Dashboard 一起使用。

【讨论】:

  • 如果我理解正确{.active} 将是一个静态解决方案,它只适用于启动。我现在编辑了这个问题,以澄清我需要能够以编程方式更改选项卡(例如,通过observeEvent() 调用)。 (为了简单起见,我将其排除在 MRE 之外。)
  • 是的,我了解静态解决方案,感谢您的澄清!
  • 仅供参考,静态 {.active} 已在 ShinyDashboard 上更正,应该很快就会可用,请参阅我的编辑。
  • 很高兴他们这么快就修好了。发布后会很方便。
【解决方案2】:

您可以将actionButton 本身包装在tags$a 中,并链接到#section-mytab,而不是observeEvent。请注意,使用runtime: shiny时,您必须在选项卡名称前添加section-

这是否解决了您的问题,或者您需要它与observeEvent 一起使用?

---
title: "Tabset Column"
output: flexdashboard::flex_dashboard
runtime: shiny
---

Column 
-------------------------------------
  
### Chart 1
  
```{r, echo = FALSE}
tags$a(href = "#section-mytab",
  shiny::actionButton("btn1", "go to mytab")
       )
```

Column {.tabset}
-------------------------------------
    
### Chart 2

```{r}

```   
  
### Chart 3 {#mytab}
  
```{r}

```

如果需要,可以使用 {shinyjs} 和不可见的 actionButton 将上述逻辑与 observeEvent 结合使用。诀窍就在这里,我们仍然使用actionButton 来触发选项卡。但是实际的按钮没有显示display: none(重要的是,按钮没有设置为hidden,因为这会阻止它被点击)。然后我们创建另一个actionButton,由observeEvent 观察。这可以触发其他计算等,最后是actionButton 上的click,未显示。如果您有更多页面并且想要从第 1 页跳转到第 2 页上的选项卡 3,那么我们将需要两个 clicks:一个更改页面,一个激活选项卡。但是我们都可以在observeEvent 中触发它。它很老套,看起来不像是好代码,但从好的方面来说,它可以工作,即使没有自定义 javascript 函数。

---
title: "Tabset Column"
output: 
flexdashboard::flex_dashboard
runtime: shiny
---

```{r global, echo = FALSE}
library(shiny)
library(shinyjs)
useShinyjs(rmd = TRUE)
```


Column 
-------------------------------------
  
### Chart 1

```{r, echo = FALSE}
observeEvent(input$btn1, {
  # do some calculations here
  click("btn2")})
 
shiny::actionButton("btn1", "do something")

tags$a(href = "#section-mytab",
  # set this button to `display: none;` but *not* to `hidden`
  shiny::actionButton("btn2", "go to mytab", style = "display: none")
  )
```

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

### Chart 2

```{r}

```   
  
### Chart 3 {#mytab}
  
```{r}

```

【讨论】:

  • 是的,理想情况下我需要observeEvent 的灵活性。就我而言,这是一个更复杂的例程的一部分,它存在于 observeEvent 中。
  • @landroni:我们可以将我的方法与observeEvent 结合起来。这有点像 hack,但它确实有效。
  • 这是一个不错的技巧,谢谢。我认为这应该符合我的目的。对于激活按钮,有没有办法在没有shinyjs的情况下click按钮?
  • @landroni:我还没想出办法。它是 {shinyjs} 或原始 javascript。
  • 看起来问题来自包含 useShinyjs(rmd = TRUE) 调用的块。在 MRE 中它是 echo = FALSE,这很有效(在我的实际仪表板中也是如此)。相反,在我的仪表板中,该块最初是 include=FALSE,这似乎是导致问题的原因。我最好的猜测是useShinyjs 生成的输出需要包含在编织文档中以使其调用工作(例如click)。现在似乎可以工作了,再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-26
  • 2021-12-22
相关资源
最近更新 更多