链接到闪亮应用程序的选项卡或面板
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()
属于 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)
根据 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
是您可以为 tabsetPanel
、Navbar
或 NavlistPanel
定义的新 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)
我如何设法 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()
属于 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)
根据 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
是您可以为 tabsetPanel
、Navbar
或 NavlistPanel
定义的新 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 到另一个选项卡 。多亏了
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)