链接到闪亮应用程序的选项卡或面板

Linking to a tab or panel of a shiny app

我如何设法 link 从给定的闪亮部分到位于其他 tabs/panels 上的部分?

更新

我在下面起草的解决方案适用于 linking 到 tabs/panels 的明确情况(这就是我所要求的)。

但是,我也有兴趣了解 link 闪亮应用程序部分的更通用方法。

例子

我想 link 从面板 A 到面板 B,但我不太确定在单击面板 A 中的操作 link 时我需要指定什么作为操作.

#tab-4527-2 来自调查 ui 的 HTML 输出,但我只是看到每次重新启动应用程序时这些值都会发生变化。

library(shiny)

# UI ---------------------------------------------------------------------

ui <- fluidPage(
  tabsetPanel(
    tabPanel(
      "A",
      p(),
      actionLink("link_to_tabpanel_b", "Link to panel B")
    ),
    tabPanel(
      "B",
      h3("Some information"),
      tags$li("Item 1"),
      tags$li("Item 2")
    )
  )
)

# Server ------------------------------------------------------------------

server <- function(input, output, session) {
  observeEvent(input$link_to_tabpanel_b, {
    tags$a(href = "#tab-4527-2")
  })
}

shinyApp(ui, server)

以下解决方案基于我从评论中获得的输入。

注意 updateTabsetPanel() 属于 shinyupdateTabItems()shinydashboard 包的一个函数。它们似乎可以互换使用。

library(shiny)
library(shinydashboard)

# UI ---------------------------------------------------------------------

ui <- fluidPage(
  tabsetPanel(
    id = "panels",
    tabPanel(
      "A",
      p(),
      actionLink("link_to_tabpanel_b", "Link to panel B")
    ),
    tabPanel(
      "B",
      h3("Some information"),
      tags$li("Item 1"),
      tags$li("Item 2"),
      actionLink("link_to_tabpanel_a", "Link to panel A")
    )
  )
)

# Server ------------------------------------------------------------------

server <- function(input, output, session) {
#   observeEvent(input$link_to_tabpanel_b, {
#     tags$a(href = "#tab-4527-2")
#   })
  observeEvent(input$link_to_tabpanel_b, {
    newvalue <- "B"
    updateTabItems(session, "panels", newvalue)
  })
  observeEvent(input$link_to_tabpanel_a, {
    newvalue <- "A"
    updateTabsetPanel(session, "panels", newvalue)
  })
}

shinyApp(ui, server)

根据 Rappster 的代码和逻辑。可以设置任何类型的链接。 Link到TabsetPanel可以被updataTabsetPanel使用。 Link到Navbar可以用updateNavbarPage(session, inputId, selected = NULL)。这些可以通过 ?updateTabsetPanel 找到,如下所示。

updateTabsetPanel(session, inputId, selected = NULL)

updateNavbarPage(session, inputId, selected = NULL)

updateNavlistPanel(session, inputId, selected = NULL)

请注意 selected 是您可以为 tabsetPanelNavbarNavlistPanel 定义的新 ID。

我们刚刚发布了 routing library,这使得 Shiny 中的链接变得容易。简而言之,它是这样的。

make_router(
   route("<your_app_url>/main",  main_page_shiny_ui),
   route("<your_app_url>/other", other_page_shiny_ui)
)

可以在 blog post 中找到更多信息。

您可以给您的 tabsetPanel 一个 ID,然后将 updateTabsetPanel 与您的 observeEvent

一起使用
library(shiny)

# UI ---------------------------------------------------------------------

ui <- fluidPage(
  tabsetPanel(id = "demo",
    tabPanel(
      "A",
      p(),
      actionLink("link_to_tabpanel_b", "Link to panel B")
    ),
    tabPanel(
      "B",
      h3("Some information"),
      tags$li("Item 1"),
      tags$li("Item 2")
    )
  )
)

# Server ------------------------------------------------------------------

server <- function(input, output, session) {
  observeEvent(input$link_to_tabpanel_b, {
    updateTabsetPanel(session, "demo", "B")
  })
}

shinyApp(ui, server)

我一直在为同样的问题而苦苦挣扎,真的很想通过 URL link 到另一个选项卡 。多亏了 并通过使用 observe 来解析来自 url 的输入,对我来说以下工作有效(并且可以通过添加来切换选项卡/?tab=B 到 URL,例如 http://localhost:1234/?tab=B):

library(shiny)

# UI ---------------------------------------------------------------------

ui <- fluidPage(
  tabsetPanel(id = "demo",
              tabPanel(
                "A",
                p(),
                actionLink("link_to_tabpanel_b", "Link to panel B")
              ),
              tabPanel(
                "B",
                h3("Some information"),
                tags$li("Item 1"),
                tags$li("Item 2")
              )
  )
)

# Server ------------------------------------------------------------------

server <- function(input, output, session) {
  # Allow url parsing
  observe({
    query <- parseQueryString(session$clientData$url_search)
    if (!is.null(query)) {
      for (name in names(query)) {
        if (name == "tab") {
          # Change tab
          try(updateTabsetPanel(session, "demo", selected = query[[name]]))
        } else {
          # Update inputs - this part is not really necessary if you just want to change the tabs, 
          # but I also needed to update other inputs from the url
          try(updateTextInput(session, name, value = query[[name]]), silent = TRUE)
        }
      }
    } 
  })
  
  observeEvent(input$link_to_tabpanel_b, {
    updateTabsetPanel(session, "demo", "B")
  })
}

shinyApp(ui, server)