rstudio / shinydashboard

Shiny Dashboarding framework
https://rstudio.github.io/shinydashboard/
Other
883 stars 300 forks source link

sidebar id is not in input inside a RMarkdown #407

Open victordebuen opened 1 month ago

victordebuen commented 1 month ago

Hello

I am trying to create a dashboard that will allow me to know which menu is selected as shown here https://rstudio.github.io/shinydashboard/behavior.html

If I make it as an app it works perfectly but if I embed a RMardown it doesn't work and input$tabs is NULL.

test_shinydashboard_sidebar_id_inside_RMarkdown.Rmd.txt

Sorry, I didn't know how to write the example code because it's RMarkdown and it didn't let me upload a file with extension .Rmd, so I added .txt at the end.

RMarkdown makes it quite easy for me to publish applications by simply copying the file to the shiny server directory. That's why I wanted to point out this small problem, although it's clearly not very serious because you can refactor the code as a shiny app. I also wanted to notify you in case this fact is hiding another more serious latent problem.

Thank you very much for your attention.

YongbingDing commented 1 month ago

您好,丁永兵已经收到您的邮件,谢谢。

gadenbuie commented 1 month ago

You can include the example by placing it inside a code block delimited by four backticks ````. You can copy the template below and then paste in your Rmd contents.


title: My rmd

My Rmd

library(tidyverse)
victordebuen commented 1 month ago

Thanks a lot, @gadenbuie

Here you can see how under RMarkdown there is no ìnput$tags object at all, which should respond to menu events.

Captura desde 2024-05-31 10-45-35

This is the RMarkdown code with which I can't see any value of input$tabs. I used textInput``` andupdateTextInputinside an observe because thetextOutputtext is white and not visible on the sideBar. I have added an ````invalidateLater to the ``observe so that it is clear that it does not react at all to menu item selection.

---
output: html_document
runtime: shiny
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
library(shiny)
library(shinydashboard)
library(tidyverse)
dashboardPage(
  dashboardHeader(), 
  dashboardSidebar(
    sidebarMenu(
      # Setting id makes input$tabs give the tabName of currently-selected tab
      id = "tabs",

      menuItem("Dashboard", tabName = "dashboard"),
      menuItem("Widgets", tabName = "widgets"),
      menuItem("Charts",
               menuSubItem("Sub-item 1", tabName = "subitem1"),
               menuSubItem("Sub-item 2", tabName = "subitem2")
      )
    ),
    textInput("res", label="You have selected", value = "You've selected: 'NONE'")
  ),
  dashboardBody(
    tabItems(
      tabItem("dashboard", "Dashboard tab content"),
      tabItem("widgets", "Widgets tab content"),
      tabItem("subitem1", "Sub-item 1 tab content"),
      tabItem("subitem2", "Sub-item 2 tab content") 
    )
  )
)
  observe({
    invalidateLater(1000)
    list_of_inputs <- reactiveValuesToList(input)
    cat("TRACE Shiny inputs:\n"); print(names(list_of_inputs))
    if(is.null(input$tabs)) {
      tag = "NULL"
    } else {
      tag = paste0("'",input$tabs,"'")  
    }
    updateTextInput(session, "res", value = paste0("At '",strftime(Sys.time(),"%H:%M:%S"),"' tag: ",tag))
  })