我想用来创建指向使用和shiny.router的闪亮应用程序选项卡的可共享链接。navbarPagetabPanel
这是不起作用的可重现示例:
library(shiny)
library(shiny.router)
page_1 <- tabPanel("Page 1", value = "page_1",
"This is Page 1")
page_2 <- tabPanel("Page 2", value = "page_2",
"This is Page 2")
router <- make_router(
route("/", page_1),
route("page2", page_2)
)
#+++++++++++++
# ui
#+++++++++++++
ui <- navbarPage("Dashboard", theme = shinytheme("flatly"),
router$ui
)
#+++++++++++++
# server
#+++++++++++++
server <- function(input, output, session)
{
router$server(input, output, session)
}
shinyApp(ui, server)
Run Code Online (Sandbox Code Playgroud)
如果我将这段代码用于 ui 部分,它会起作用:
#+++++++++++++
# ui
#+++++++++++++
ui <- navbarPage("Dashboard", theme = shinytheme("flatly"),
tabPanel(
tags$ul(
tags$li(a(href = route_link("/"), "Page 1")),
tags$li(a(href = route_link("page2"), "Page 2"))
),
router$ui
)
)
Run Code Online (Sandbox Code Playgroud)
但这并没有给我留下一个看起来合适的导航栏。是否可以使用navbarPageandtabPanel结构shiny.router?
以下是我的答案的稍微修改版本,它避免使用library(shiny.router).
区别在于使用shiny::updateNavbarPage而不是shinydashboard::updateTabItems:
# remotes::install_github("rstudio/shinythemes")
library(shiny)
library(shinythemes)
ui <- navbarPage(title = "Dashboard", id = "navbarID", theme = shinytheme("flatly"),
tabPanel("Page 1", value = "page_1", "This is Page 1"),
tabPanel("Page 2", value = "page_2", "This is Page 2")
)
server <- function(input, output, session){
observeEvent(input$navbarID, {
# http://127.0.0.1:3252/#page_1
# http://127.0.0.1:3252/#page_2
newURL <- paste0(
session$clientData$url_protocol,
"//",
session$clientData$url_hostname,
":",
session$clientData$url_port,
session$clientData$url_pathname,
"#",
input$navbarID
)
updateQueryString(newURL, mode = "replace", session)
})
observe({
currentTab <- sub("#", "", session$clientData$url_hash) # might need to wrap this with `utils::URLdecode` if hash contains encoded characters (not the case here)
if(!is.null(currentTab)){
updateNavbarPage(session, "navbarID", selected = currentTab)
}
})
}
shinyApp(ui, server)
Run Code Online (Sandbox Code Playgroud)
上面是使用-正如我之前的回答中所示,clientData$url_hash可以完成相同的操作。clientData$url_search
编辑:使用mode = "push"inupdateQueryString进行浏览器导航:
library(shiny)
library(shinythemes)
ui <- navbarPage(title = "Dashboard", id = "navbarID", theme = shinytheme("flatly"),
tabPanel("Page 1", value = "page_1", "This is Page 1"),
tabPanel("Page 2", value = "page_2", "This is Page 2")
)
server <- function(input, output, session){
observeEvent(session$clientData$url_hash, {
currentHash <- sub("#", "", session$clientData$url_hash)
if(is.null(input$navbarID) || !is.null(currentHash) && currentHash != input$navbarID){
freezeReactiveValue(input, "navbarID")
updateNavbarPage(session, "navbarID", selected = currentHash)
}
}, priority = 1)
observeEvent(input$navbarID, {
currentHash <- sub("#", "", session$clientData$url_hash) # might need to wrap this with `utils::URLdecode` if hash contains encoded characters (not the case here)
pushQueryString <- paste0("#", input$navbarID)
if(is.null(currentHash) || currentHash != input$navbarID){
freezeReactiveValue(input, "navbarID")
updateQueryString(pushQueryString, mode = "push", session)
}
}, priority = 0)
}
shinyApp(ui, server)
Run Code Online (Sandbox Code Playgroud)
替代使用clientData$url_search和mode = "push":
library(shiny)
library(shinythemes)
ui <- navbarPage(title = "Dashboard", id = "navbarID", theme = shinytheme("flatly"),
tabPanel("Page 1", value = "page_1", "This is Page 1"),
tabPanel("Page 2", value = "page_2", "This is Page 2")
)
server <- function(input, output, session){
observeEvent(getQueryString(session)$page, {
currentQueryString <- getQueryString(session)$page # alternative: parseQueryString(session$clientData$url_search)$page
if(is.null(input$navbarID) || !is.null(currentQueryString) && currentQueryString != input$navbarID){
freezeReactiveValue(input, "navbarID")
updateNavbarPage(session, "navbarID", selected = currentQueryString)
}
}, priority = 1)
observeEvent(input$navbarID, {
currentQueryString <- getQueryString(session)$page # alternative: parseQueryString(session$clientData$url_search)$page
pushQueryString <- paste0("?page=", input$navbarID)
if(is.null(currentQueryString) || currentQueryString != input$navbarID){
freezeReactiveValue(input, "navbarID")
updateQueryString(pushQueryString, mode = "push", session)
}
}, priority = 0)
}
shinyApp(ui, server)
Run Code Online (Sandbox Code Playgroud)
PS:使用shiny的书签功能也可以恢复选定的选项卡,只要navbarPage提供了id.
PPS:这里navbarPage可以找到有关使用辅助导航的相关问题。
| 归档时间: |
|
| 查看次数: |
1252 次 |
| 最近记录: |