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

22

我如何将一个闪亮的部分链接到位于其他选项卡/面板上的部分?

更新

下面我提出的解决方案适用于链接到选项卡/面板的显式情况(这就是我提出的问题)。

但是,我也想知道更通用的链接 shiny 应用程序部分的方法。

示例

我想从面板 A 链接到面板 B,但我不太确定当单击面板 A 中的操作链接时需要指定什么操作。

#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)

1
这个能帮到你吗?https://dev59.com/iY_ea4cB1Zd3GeqPTdEU#32972517 - Pork Chop
@PorkChop:它确实解决了我的直接问题,谢谢!你知道一种更通用的方法来链接任意闪亮应用程序部分吗? - Rappster
1
所有的 HTML 组件都将被分配一个 唯一 的 ID,因此您可以使用它们来链接您的内容。如果您想要做一些复杂的事情,您需要编写一些 Javascript 代码。您可以在这里查看示例:[https://groups.google.com/forum/#!topic/shiny-discuss/sJlasQf71fY]。 - Pork Chop
我发现通过将updateTabItems()替换为updateTabsetPanel(),你可以只使用Shiny库而不需要加载shinydashboard来完成这个操作。这并不是什么大问题。 - SprengMeister
@SprengMeister:谢谢,很高兴知道这个。 - Rappster
5个回答

13
以下解决方案是基于我从评论中获得的输入。
请注意,updateTabsetPanel() 属于 shiny,而 updateTabItems()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)

5

您可以为您的tabsetPanel指定一个id,并在observeEvent中使用updateTabsetPanel来更新它。

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)

5
我们刚刚发布了一个路由库,它使得在Shiny中进行链接变得容易。以下是简要说明。
make_router(
   route("<your_app_url>/main",  main_page_shiny_ui),
   route("<your_app_url>/other", other_page_shiny_ui)
)

更多信息可以在这个博客文章中找到。


1
我们不得不将一个包的名称更改为“shiny.router”。我刚刚在博客文章中更改了链接。所以,如果@Rappster已经在使用我们的库,请确保更新您的GIT配置。 - KrzysztofWrobel

4

我曾经遇到同样的问题,非常希望能够通过URL链接到不同的选项卡。感谢这个简单的例子,通过使用observe从url解析输入,对我而言以下方法有效(并且通过在URL中添加/?tab=B来切换选项卡成为可能,例如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)

0
根据Rappster的代码和逻辑,可以设置任何类型的链接。可以使用updataTabsetPanel链接到TabsetPanel。可以使用updateNavbarPage(session, inputId, selected = NULL)链接到Navbar。这些可以在?updateTabsetPanel中找到。
updateTabsetPanel(session, inputId, selected = NULL)

updateNavbarPage(session, inputId, selected = NULL)

updateNavlistPanel(session, inputId, selected = NULL)

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接