问题
How do I manage to link from a given shiny part to parts that are located on other tabs/panels?
Update
The solution I drafted below works for the explicit case of linking to tabs/panels (and that's what I asked for).
However, I'd be interested to also know about more generic ways of linking parts of a shiny app.
Example
I'd like to link from panel A to panel B, but I'm not quite sure what I need to specify as an action when the action link in panel A is clicked.
The value #tab-4527-2
came from investigating the HTML output of ui
, but I just saw that those values change each time I restart the app.
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:
We have just released a routing library, which makes linking in Shiny easy. Here's how it looks like in a nutshell.
make_router(
route("<your_app_url>/main", main_page_shiny_ui),
route("<your_app_url>/other", other_page_shiny_ui)
)
More information can be found in this blog post.
回答2:
The following solution is based on the inputs I got from the comments.
Note that updateTabsetPanel()
belongs to shiny
while updateTabItems()
is a function of the shinydashboard
package. They seem to work interchangeably.
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)
回答3:
You can give your tabsetPanel
an id and use updateTabsetPanel
with your 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)
回答4:
According to the code and logic from Rappster. It is possible to set any kind of links. Link to TabsetPanel
can be used by updataTabsetPanel
. Link to Navbar
can use updateNavbarPage(session, inputId, selected = NULL)
. These can be found by ?updateTabsetPanel
as following.
updateTabsetPanel(session, inputId, selected = NULL)
updateNavbarPage(session, inputId, selected = NULL)
updateNavlistPanel(session, inputId, selected = NULL)
Please notice selected
is the new id that you can define for tabsetPanel
, Navbar
, or NavlistPanel
.
来源:https://stackoverflow.com/questions/34315485/linking-to-a-tab-or-panel-of-a-shiny-app