如何在Shiny应用中实现点击按钮返回前一个打开的Shiny应用页面
这个需求完全可以实现,以下是两个应用的完整实现方案:
App1 配置(点击按钮打开App2)
App1的逻辑是点击动作按钮后,调用前端JS在新标签页打开App2的地址,同时可以选择将自身地址作为query参数传递给App2,方便App2动态获取跳转回的地址,适配App1地址不固定的场景。
library(shiny) ui <- fluidPage( actionButton("action1", "点击打开App2"), # 注册接收自定义消息的前端脚本 tags$script(HTML(" Shiny.addCustomMessageHandler('open_new_tab', function(url) { window.open(url, '_blank'); }); ")) ) server <- function(input, output, session) { observeEvent(input$action1, { # 替换为你的App2实际部署地址 app2_url <- "http://你的App2部署地址" # 拼接App1的当前访问地址 app1_current_url <- paste0( session$clientData$url_protocol, "//", session$clientData$url_hostname, ifelse(session$clientData$url_port == "", "", paste0(":", session$clientData$url_port)), session$clientData$url_pathname ) # 把App1地址编码后作为参数传给App2 full_app2_url <- paste0(app2_url, "?app1_url=", URLencode(app1_current_url)) session$sendCustomMessage("open_new_tab", full_app2_url) }) } shinyApp(ui, server)
App2 配置(点击按钮跳转回App1)
App2可以直接读取URL中的query参数拿到App1的地址,点击按钮后调用JS跳转即可。如果你确定App1地址固定,也可以直接写死地址不用传参。
library(shiny) ui <- fluidPage( actionButton("action2", "点击返回App1"), tags$script(HTML(" Shiny.addCustomMessageHandler('jump_to_url', function(url) { // 如果你想跳转后保留App2标签,就用window.open(url, '_blank')替换下面的代码 window.location.href = url; }); ")) ) server <- function(input, output, session) { # 读取URL中传递的App1地址 app1_url <- reactive({ query <- parseQueryString(session$clientData$url_search) # 如果没拿到传参,也可以在这里写死App1的固定地址 if(!is.null(query$app1_url)) { return(URLdecode(query$app1_url)) } else { return("http://你的App1固定部署地址") } }) observeEvent(input$action2, { session$sendCustomMessage("jump_to_url", app1_url()) }) } shinyApp(ui, server)
注意事项
- 如果两个应用部署在同一个域名下,跳转逻辑不会有跨域限制,不同域名也可以正常跳转,只是无法共享session等数据,不影响基础跳转功能
- 如果你不需要保留App2的标签页,用
window.location.href直接替换当前页面即可,如果需要保留,改成window.open(url, '_blank')即可在新标签打开App1,保留App2的标签页
内容的提问来源于stack exchange,提问作者manu p
相关产品推荐
相关产品推荐

